init1=function(){
	gm=$("gradmap");
	
	//地図枠を決定
	gm.style.overflow="hidden";
	if(gm.style.position!="relative" && gm.style.position!="absolute"){
		gm.style.position="relative";
		gm.style.left="0px";
		gm.style.top="0px";
	}

	//地図のサイズを取得
	gmsize=bytefx.$size(gm);
	w=gmsize.width;
	h=gmsize.height;
	delete gmsize
	
	gmHTML ='<div id="map0" class="map"></div>\n';//いきなりinnerHTMLに入れると、ブラウザによる自動補完が次々になされてコードが崩れる
	gmHTML+='<div id="map1" class="map"></div>\n';
	gmHTML+='<div id="map2" class="map"></div>\n';
	gmHTML+='<div id="map3" class="map"></div>\n';
	gmHTML+='<div id="map4" class="map"></div>\n';
	gmHTML+='<div id="map5" class="map"></div>\n';
	gmHTML+='<div id="map6" class="map"></div>\n';
	gmHTML+='<div id="map7" class="map"></div>\n';
	gmHTML+='<div id="map8" class="map"></div>\n';
	gmHTML+='<div id="pointer" class="map" style="width:350px;visibility:hidden;z-index:100;left:-1000px;top:-1000px;">\n';
	gmHTML+='<table border="0" cellpadding="0" cellspacing="0">\n';
	gmHTML+='	<tr><td class="pointer1" valign="bottom" onClick="infoclose();"><a href="javascript:wclose();">閉じる</a></td></tr>\n';
	gmHTML+='	<tr><td class="pointer2"><span id="mes"></span></td></tr>\n';
	gmHTML+='	<tr><td class="pointer3">&nbsp;</td></tr>\n';
	gmHTML+='</table>\n';
	gmHTML+='</div>\n';
	gmHTML+='<div id="wpointer" class="map" style="width:350px;visibility:hidden;z-index:100;left:-1000px;top:-1000px;">\n';
	gmHTML+='<table border="0" cellpadding="0" cellspacing="0">\n';
	gmHTML+='	<tr><td class="wpointer1" valign="bottom" onClick="wclose();"><a href="javascript:wclose();">閉じる</a></td></tr>\n';
	gmHTML+='	<tr><td class="wpointer2"><a href="javascript:inputinfo();">ここに書き込む</a></td></tr>\n';
	gmHTML+='	<tr><td class="wpointer3">&nbsp;</td></tr>\n';
	gmHTML+='</table>\n';
	gmHTML+='</div>\n';
	gm.innerHTML=gmHTML;

	//地図データのパース
	imglog=new Array();
	for(i=0;i<ilog.length;i++){
		imglog[i]=ilog[i].split(":::");
		for(j=0;j<imglog[i].length;j++){
			if(imglog[i][j]==""){
				delete imglog[i][j];
			}
		}
	}
	delete ilog;
}
init2=function(img_i,img_j,img_x,img_y){
	//初期読み込みデータの作成
	filename=new Array();
	if((img_i-1) in imglog){
		if((img_j-1) in imglog[img_i-1]) filename.push(imglog[img_i-1][img_j-1]); else filename.push("F.png");
		if((img_j) in imglog[img_i-1]) filename.push(imglog[img_i-1][img_j]); else filename.push("F.png");
		if((img_j+1) in imglog[img_i-1]) filename.push(imglog[img_i-1][img_j+1]); else filename.push("F.png");
	}
	else{
		filename.push("F.png");
		filename.push("F.png");
		filename.push("F.png");
	}	

	if((img_j-1) in imglog[img_i]) filename.push(imglog[img_i][img_j-1]); else filename.push("F.png");
	if((img_j) in imglog[img_i]) filename.push(imglog[img_i][img_j]); else filename.push("F.png");
	if((img_j+1) in imglog[img_i]) filename.push(imglog[img_i][img_j+1]); else filename.push("F.png");

	if((img_i+1) in imglog){
		if((img_j-1) in imglog[img_i+1]) filename.push(imglog[img_i+1][img_j-1]); else filename.push("F.png");
		if((img_j) in imglog[img_i+1]) filename.push(imglog[img_i+1][img_j]); else filename.push("F.png");
		if((img_j+1) in imglog[img_i+1]) filename.push(imglog[img_i+1][img_j+1]); else filename.push("F.png");
	}
	else{
		filename.push("F.png");
		filename.push("F.png");
		filename.push("F.png");
	}
	
	//ピースの作成
	p=$("map0","map1","map2","map3","map4","map5","map6","map7","map8");

	//地図の位置を求める
	x2=w/2-img_x;
	y2=h/2-img_y-ih;

	//初期状態の作成
	for(i=0;i<3;i++){
		//ピースを配置
		p[3*i].style.width=iw;
		p[3*i].style.height=ih;
		p[3*i].style.backgroundImage="url(map/"+filename[3*i]+")";
		bytefx.position(p[3*i],{x:x2-iw,y:y2});
		
		p[3*i+1].style.width=iw;
		p[3*i+1].style.height=ih;
		p[3*i+1].style.backgroundImage="url(map/"+filename[3*i+1]+")";
		bytefx.position(p[3*i+1],{x:x2,y:y2});

		p[3*i+2].style.width=iw;
		p[3*i+2].style.height=ih;
		p[3*i+2].style.backgroundImage="url(map/"+filename[3*i+2]+")";
		bytefx.position(p[3*i+2],{x:x2+iw,y:y2});

		y2+=ih;
	}
	delete filename;
	y2-=2*ih;
}
ajax=function(readphp,writephp,editphp,delphp){
	//非同期通信のコア
	getpoints=function(var0,var1,ok){
		para = "var0="+var0 + "&var1="+var1;
		myAjax = new Ajax.Request(
			readphp, 
			{
				method: "post", 
				parameters: para,
				onComplete: ok
			}
		);
	}
	putpoint=function(iiinfo,jjinfo,xxinfo,yyinfo,content,ok){
		para = "iiii="+iiinfo + "&jjjj="+jjinfo + "&xxx="+xxinfo + "&yyy="+yyinfo + "&cccccc="+content;
		myAjax = new Ajax.Request(
			writephp, 
			{
				method: "post", 
				parameters: para,
				onComplete: ok
			}
		);
	}
	editpoint=function(iiinfo,jjinfo,xxinfo,yyinfo,content,ok){
		para = "iiii="+iiinfo + "&jjjj="+jjinfo + "&xxx="+xxinfo + "&yyy="+yyinfo + "&cccccc="+content;
		myAjax = new Ajax.Request(
			editphp, 
			{
				method: "post", 
				parameters: para,
				onComplete: ok
			}
		);
	}
	delpoint=function(iiinfo,jjinfo,xxinfo,yyinfo,ok){
		para = "iiii="+iiinfo + "&jjjj="+jjinfo + "&xxx="+xxinfo + "&yyy="+yyinfo;
		myAjax = new Ajax.Request(
			delphp, 
			{
				method: "post", 
				parameters: para,
				onComplete: ok
			}
		);
	}
}
putinformation=function(){
	//開いている情報ウインドウ番号(-1ならば開いていない)
	opened=-1;
	
	info=new Array();
	//情報ウインドウを閉じる
	infoclose=function (){
		$("pointer").style.visibility="hidden";
		opened=-1;
	}
	//情報ウインドウを開く
	infoopen=function (idnum){
		if(opened>-1) infoclose();
		opened=idnum;
		$("mes").innerHTML=info[idnum];

		ppos= bytefx.$position($("info"+idnum));
		l=$("pointer");
		bytefx.position(l,{x:ppos.x-def.x,y:ppos.y-def.y});
		l.style.visibility="visible";
	}

	last=0;
	//情報ポイントを追加する
	addpoint=function (pnum,last,left,top,description){
		ppnuminnerHTML="<div id=\"info"+last+"\" class=\"point\" style=\"left:"+left+"px;top:"+top+"px;\" onClick=\"infoopen("+last+");\"></div>";
		info.push(description);
		p[pnum].innerHTML+=ppnuminnerHTML;
	}
	
	//情報ポイント一覧を表示する
	show=function (reText,pnum,i_info,j_info){
		p[pnum].innerHTML="";
		if(reText!=""){
			data=reText.split(":::");
			for(a=0;a<(data.length-1)/3;a++){
				tmpdata=data[3*a+2];
				while(tmpdata.search("<br>")>-1)
					tmpdata=tmpdata.replace("<br>",";;");
				while(tmpdata.search(/<.*?>/)>-1)
					tmpdata=tmpdata.replace(/<.*?>/,"");
				addpoint(pnum,last,data[3*a+0],data[3*a+1],data[3*a+2]+"<br> <a href=\"javascript:editinfo("+i_info+","+j_info+","+data[3*a+0]+","+data[3*a+1]+",'"+tmpdata+"',"+last+");\">編集</a> <a href=\"javascript:delinfo("+i_info+","+j_info+","+data[3*a+0]+","+data[3*a+1]+",'"+tmpdata+"',"+last+");\">削除</a>");
				last++;
			}
		}
	}
	//ここまでポイント配置のための関数定義
}
init3=function(img_i,img_j){
	getpoints(img_i-1,img_j-1,function (re){show(re.responseText,0,img_i-1,img_j-1)});
	getpoints(img_i-1,img_j,function (re){show(re.responseText,1,img_i-1,img_j)});
	getpoints(img_i-1,img_j+1,function (re){show(re.responseText,2,img_i-1,img_j+1)});
	getpoints(img_i,img_j-1,function (re){show(re.responseText,3,img_i,img_j-1)});
	getpoints(img_i,img_j,function (re){show(re.responseText,4,img_i,img_j)});
	getpoints(img_i,img_j+1,function (re){show(re.responseText,5,img_i,img_j+1)});
	getpoints(img_i+1,img_j-1,function (re){show(re.responseText,6,img_i+1,img_j-1)});
	getpoints(img_i+1,img_j,function (re){show(re.responseText,7,img_i+1,img_j)});
	getpoints(img_i+1,img_j+1,function (re){show(re.responseText,8,img_i+1,img_j+1)});
}
writeinformation=function(){
	//書き込みのための関数
	xinfo=0;yinfo=0;
	wok=true;
	wp=$("wpointer");
	wpointon=function (event){
		if(Event.isLeftClick(event)){
			pos= bytefx.$position(p[4]);
			mx = Event.pointerX(event);
			my = Event.pointerY(event);
			xinfo=mx-pos.x;
			yinfo=my-pos.y;
			wp.style.left=mx-7-def.x;
			wp.style.top=my-7-def.y;
			wp.style.visibility="visible";
		}
	}
	
	wclose=function (){
		$("wpointer").style.visibility="hidden";
	}
	if(document.documentElement.getAttribute("style") != document.documentElement.style){//IE以外なら
		for(i=0;i<9;i++) Event.observe(p[i], "dblclick", wpointon, true);//ダブルクリックでウインドウ表示
		//IEはShift+左クリック(下のほうで定義している)
	}	
	getinfo=function (initmes){
		msg = prompt("情報を入力してください\n改行は;;(セミコロン2つ)と入力してください\nタグや特殊記号は使えません。URLは自動リンクされます。",initmes);
		if (!msg) return "";
		else return msg;
	}
	inputinfo=function (){
		iinfo=imgi;
		jinfo=imgj;

		if(xinfo<0){
			jinfo--;
			xinfo+=iw;
		}
		else if(xinfo>iw){
			jinfo++;
			xinfo-=iw;
		}
		if(yinfo<0){
			iinfo--;
			yinfo+=ih;
		}
		else if(yinfo>ih){
			iinfo++;
			yinfo-=ih;
		}
		xinfo-=7;
		yinfo-=7;
		if (!(iinfo in imglog)) {alert("ここには書き込めません。");wclose();return;}
		if (!(jinfo in imglog[iinfo])) {alert("ここには書き込めません。");wclose();return;}

		tmp=getinfo("");
		tmp=tmp.replace("?","？");
		tmp=tmp.replace("%","％");
		tmp=tmp.replace("；；",";;");
		if (tmp.indexOf("=")>0) {alert("\"=\"は使わないでください!");infoclose();wok=true;return;}
		if (tmp=="") {wclose();return;}

		putpoint(iinfo,jinfo,xinfo,yinfo,tmp,function (re){
			alert(re.responseText);
			if(re.responseText=="succeed"){
				pp=4+(jinfo-imgj)+3*(iinfo-imgi);
				tmp=tmp.replace(";;","<br>");
				addpoint(pp,last,xinfo,yinfo,tmp+"<br> <a href=\"javascript:editinfo("+iinfo+","+jinfo+","+xinfo+","+yinfo+",'"+tmp+"',"+last+");\">編集</a> <a href=\"javascript:delinfo("+iinfo+","+jinfo+","+xinfo+","+yinfo+",'"+tmp+"',"+last+");\">削除</a>");
				last++;
			}
			wclose();
		});

	}
	editinfo=function (i_info,j_info,x_info,y_info,mes,lst){
		if(!wok) return;
		wok=false;
		tmp=getinfo(mes.replace("<br>",";;"));
		tmp=tmp.replace("?","？");
		tmp=tmp.replace("%","％");
		tmp=tmp.replace("；；",";;");
		if (tmp.indexOf("=")>0) {alert("\"=\"は使わないでください!");infoclose();wok=true;return;}
		if (tmp=="") {infoclose();wok=true;return;}

		editpoint(i_info,j_info,x_info,y_info,tmp,function (re){
			alert(re.responseText);
			if(re.responseText=="succeed"){
				info[lst]=(tmp.replace(";;","<br>")+"<br> <a href=\"javascript:editinfo("+i_info+","+j_info+","+x_info+","+y_info+",'"+tmp.replace(";;","<br>")+"',"+lst+");\">編集</a> <a href=\"javascript:delinfo("+i_info+","+j_info+","+x_info+","+y_info+",'"+tmp.replace(";;","<br>")+"',"+lst+");\">削除</a>");
				wok=true;
			}
			infoclose();
		});

	}
	delinfo=function (i_info,j_info,x_info,y_info,mes,lst){
		if(!wok) return;
		wok=false;
		tmp=confirm("本当に「"+mes.replace("<br>",";;")+"」を削除しますか？");
		if (!tmp) {infoclose();wok=true;return;}

		delpoint(i_info,j_info,x_info,y_info,function (re){
			alert(re.responseText);
			if(re.responseText=="succeed"){
				info[lst]="";
				wok=true;
			}
			infoclose();
			$("info"+lst).style.visibility="hidden";
		});

	}
}
window.onload = function (){
	imgi=22;imgj=16;
	imgx=165;imgy=95;

	init1();
	init2(imgi,imgj,imgx,imgy);
	def=bytefx.$position(gm);//地図の位置

	//関数定義
	ajax("read.php","write.php","edit.php","del.php");
	putinformation();
	init3(imgi,imgj);//情報をのせる(ここより下に書かないと関数未定義で動かない)
	writeinformation();
	
	moveto=function(img_i,img_j,img_x,img_y){
		wclose();
		infoclose();
		if(imgi!=img_i || imgj!=img_j){
			init3(img_i,img_j);
			imgi=img_i;imgj=img_j;
		}
		init2(img_i,img_j,img_x,img_y);
		imgx=img_x;imgy=img_y;
	}
	
	//ここから地図の再配置
	change =function (deli,delj,oldpos,newpos){
		bytefx.position(p[oldpos],{x:x2+delj*iw, y:y2+deli*ih});
		
		if((imgi+deli) in imglog){
			if((imgj+delj) in imglog[imgi+deli]){
				getpoints(imgi+deli,imgj+delj,function (re){show(re.responseText,newpos,imgi+deli,imgj+delj)});
				p[oldpos].style.backgroundImage="url(map/"+imglog[imgi+deli][imgj+delj]+")";
			}
			else{
				p[oldpos].innerHTML="";
				p[oldpos].style.backgroundImage="url(map/F.png)";
			}
		}
		else{
			p[oldpos].innerHTML="";
			p[oldpos].style.backgroundImage="url(map/F.png)";
		}
	}

	change9=function(){
		if(2*x2>w){
			if(2*y2>h){//中心が左上に移った
				x2-=iw;	y2-=ih;
				imgi--;imgj--;
				change(1,-1,5,6);
				change(0,-1,2,3);
				change(-1,-1,8,0);
				change(-1,0,6,1);
				change(-1,1,7,2);
				q=p[8];p[8]=p[4];p[4]=p[0];p[0]=q;
				q=p[7];p[7]=p[3];p[3]=p[2];p[2]=q;
				q=p[6];p[6]=p[5];p[5]=p[1];p[1]=q;
			
			}
			else if(2*(y2+ih)<h){//中心が左下に移った
				x2-=iw;y2+=ih;
				imgi++;imgj--;
				change(-1,-1,5,0);
				change(0,-1,8,3);
				change(1,-1,2,6);
				change(1,0,0,7);
				change(1,1,1,8);
			
				q=p[2];p[2]=p[4];p[4]=p[6];p[6]=q;
				q=p[1];p[1]=p[3];p[3]=p[8];p[8]=q;
				q=p[0];p[0]=p[5];p[5]=p[7];p[7]=q;
				
			}
			else{//中心が左に移った
				x2-=iw;
				imgj--;
				change(-1,-1,2,0);
				change(0,-1,5,3);
				change(1,-1,8,6);

				q=p[2];p[2]=p[1];p[1]=p[0];p[0]=q;
				q=p[5];p[5]=p[4];p[4]=p[3];p[3]=q;
				q=p[8];p[8]=p[7];p[7]=p[6];p[6]=q;
			}
		}
		else if(2*(x2+iw)<w){
			if(2*y2>h){//中心が右上に移った
				x2+=iw;y2-=ih;
				imgi--;imgj++;
				change(1,1,3,8);
				change(0,1,0,5);
				change(-1,1,6,2);
				change(-1,0,8,1);
				change(-1,-1,7,0);
				
				q=p[8];p[8]=p[3];p[3]=p[1];p[1]=q;
				q=p[7];p[7]=p[5];p[5]=p[0];p[0]=q;
				q=p[6];p[6]=p[4];p[4]=p[2];p[2]=q;
				
			}
			else if(2*(y2+ih)<h){//中心が右下に移った
				x2+=iw;y2+=ih;
				imgi++;imgj++;
				change(-1,1,3,2);
				change(0,1,6,5);
				change(1,1,0,8);
				change(1,0,2,7);
				change(1,-1,1,6);
				
				q=p[0];p[0]=p[4];p[4]=p[8];p[8]=q;
				q=p[3];p[3]=p[7];p[7]=p[2];p[2]=q;
				q=p[6];p[6]=p[1];p[1]=p[5];p[5]=q;

			}
			else{//中心が右に移った
				x2+=iw;
				imgj++;
				change(-1,1,0,2);
				change(0,1,3,5);
				change(1,1,6,8);
				
				q=p[0];p[0]=p[1];p[1]=p[2];p[2]=q;
				q=p[3];p[3]=p[4];p[4]=p[5];p[5]=q;
				q=p[6];p[6]=p[7];p[7]=p[8];p[8]=q;
			}
		}
		else{
			if(2*y2>h){//中心が上に移った
				y2-=ih;
				imgi--;
				change(-1,-1,6,0);
				change(-1,0,7,1);
				change(-1,1,8,2);
							
				q=p[6];p[6]=p[3];p[3]=p[0];p[0]=q;
				q=p[7];p[7]=p[4];p[4]=p[1];p[1]=q;
				q=p[8];p[8]=p[5];p[5]=p[2];p[2]=q;
				
			}
			else if(2*(y2+ih)<h){//中心が下に移った
				y2+=ih;
				imgi++;
				change(1,-1,0,6);
				change(1,0,1,7);
				change(1,1,2,8);
			
				q=p[0];p[0]=p[3];p[3]=p[6];p[6]=q;
				q=p[1];p[1]=p[4];p[4]=p[7];p[7]=q;
				q=p[2];p[2]=p[5];p[5]=p[8];p[8]=q;
				
			}
		}
	}
	
	if(document.documentElement.getAttribute("style") ==document.documentElement.style){//IEなら
		flag=false;
		set=function (event){
			if(event.shiftKey){
				wpointon(event);
			}
			else if(Event.isLeftClick(event)){
				wclose();
				pos= bytefx.$position(p[4]);
				x1 = Event.pointerX(event)+def.x;
				y1 = Event.pointerY(event)+def.y;
				pointpos=bytefx.$position($("pointer"));
				flag=true;
			}
		}
			
		grad=function (event){
			if(flag){
				x2 = Event.pointerX(event)-x1;
				y2 = Event.pointerY(event)-y1;
				bytefx.position($("pointer"),{x:x2+pointpos.x, y:y2+pointpos.y});
				x2 +=pos.x;
				y2 +=pos.y;
				bytefx.position(p[0],{x:x2-iw, y:y2-ih});
				bytefx.position(p[1],{x:x2, y:y2-ih});
				bytefx.position(p[2],{x:x2+iw, y:y2-ih});
				bytefx.position(p[3],{x:x2-iw, y:y2});
				bytefx.position(p[4],{x:x2, y:y2});
				bytefx.position(p[5],{x:x2+iw, y:y2});
				bytefx.position(p[6],{x:x2-iw, y:y2+ih});
				bytefx.position(p[7],{x:x2, y:y2+ih});
				bytefx.position(p[8],{x:x2+iw, y:y2+ih});
			}
		}
		
		unset=function (event){
			flag=false;
			for(i=0;i<9;i++){
				Event.stopObserving(p[i], "mousedown", set, true);
				Event.stopObserving(p[i], "mouseup", unset, true);
				Event.stopObserving(p[i], "mouseout", unset, true);
			}
			
			change9();
			for(i=0;i<9;i++){
				Event.observe(p[i], "mousedown", set, true);
				Event.observe(p[i], "mouseup", unset, true);
				Event.observe(p[i], "mouseout", unset, true);
			}
		}
		for(i=0;i<9;i++){
			//イベントListen
			Event.observe(p[i], "mousedown", set, true);
			Event.observe(p[i], "mousemove", grad, false);
			Event.observe(p[i], "mouseup", unset, true);
			Event.observe(p[i], "mouseout", unset, true);
		}
	}
	else{
		startEvent=function (ojNameStr,eventTypeNameStr,funcNameStr){
			eval(ojNameStr+".on"+eventTypeNameStr+"="+ funcNameStr);
		}
		stopEvent=function (ojNameStr,eventTypeNameStr){
			eval(ojNameStr+".on"+eventTypeNameStr+"= null");
		}

		set=function (event){
			if(Event.isLeftClick(event)){
				wclose();
				pos= bytefx.$position(p[4]);
				x1 = Event.pointerX(event)+def.x;
				y1 = Event.pointerY(event)+def.y;
				pointpos=bytefx.$position($("pointer"));
				startEvent("this", "mousemove", grad);
			}
		}
			
		grad=function (event){
			x2 = Event.pointerX(event)-x1;
			y2 = Event.pointerY(event)-y1;
			bytefx.position($("pointer"),{x:x2+pointpos.x, y:y2+pointpos.y});
			x2 +=pos.x;
			y2 +=pos.y;
			bytefx.position(p[0],{x:x2-iw, y:y2-ih});
			bytefx.position(p[1],{x:x2, y:y2-ih});
			bytefx.position(p[2],{x:x2+iw, y:y2-ih});
			bytefx.position(p[3],{x:x2-iw, y:y2});
			bytefx.position(p[4],{x:x2, y:y2});
			bytefx.position(p[5],{x:x2+iw, y:y2});
			bytefx.position(p[6],{x:x2-iw, y:y2+ih});
			bytefx.position(p[7],{x:x2, y:y2+ih});
			bytefx.position(p[8],{x:x2+iw, y:y2+ih});
		}
		
		unset=function (event){
			stopEvent("this", "mousemove");
			for(i=0;i<9;i++){
				stopEvent("p["+i+"]", "mousedown");
				stopEvent("p["+i+"]", "mouseup");
				stopEvent("p["+i+"]", "mouseout");
			}
			
			change9();

			for(i=0;i<9;i++){
				startEvent("p["+i+"]", "mousedown", set);
				startEvent("p["+i+"]", "mouseup", unset);
				startEvent("p["+i+"]", "mouseout", unset);
			}
		}
		for(i=0;i<9;i++){
			//イベントListen
			startEvent("p["+i+"]", "mousedown", set);
			startEvent("p["+i+"]", "mouseup", unset);
			startEvent("p["+i+"]", "mouseout", unset);
			startEvent("p["+i+"]", "dblclick", wpointon);
		}

	}

}