var camera = null;
var drawing_flag = false;

var scrollX = 0;
var scrollY = 0;
var frameMilli = 10;
var frameInterval = 100;
var initedFlag = false;

//高速化のため.
var ft_scroll = null;
var root = null;
var debug = null;
var menu = null;
var menuLineL = null;

function scrollEvent()
{
//	scrollY = ft_scroll.scrollTop;
//	scrollbarCamera();return;
	if(ft_scroll)
		gotoXY(0, ft_scroll.scrollTop);
}

function scrollEvil()
{
	var xy = document.viewport.getScrollOffsets();
	if(xy.top > 0)
	{
		setFtScrollY(ft_scroll.scrollTop + xy.top);
	}
	scrollTo(0,0);
}

function scrollbarCamera()
{
	if(!camera)
		return;
	
	
//	var xy = document.viewport.getScrollOffsets();
	var xy = {};
	var w = document.viewport.getWidth();
	var h = document.viewport.getHeight();
	
	xy.left = scrollX;
	xy.top = scrollY;
	
//	camera.style.left = parseInt( (xy.left + w/2)) + "px";
//	camera.style.top = parseInt((xy.top + h/2)) + "px";
	
	//視点の下限を決めておく.
	var cy = (xy.top + h/2);
	if(cy > 3484+20 - 360)
		cy = 3484+20 - 360;
	camera.style.top = parseInt(cy) + "px";

	camera.style.width = "0px";
	camera.style.height = "0px";
	
	camera.setViewPosition(xy.left, xy.top, w, h);

	camera.draw();
	root.style.top = -scrollY+"px";
	

}


var tms = new Array();
var tmc = 0;
function avrageMilli(tm)
{
	var tmm = 20;
	
	tms[tmc] = tm;
	tmc = (++tmc)%tmm;
	
	var tmu = 0
	for(var ii=0;ii<tmm;ii++)
		tmu += tms[ii];
	
	return parseInt(tmu/tmm) + " &lt; " + tm ;
}

var initViewportWidth = -1;
var initViewportHeight = -1;

function resizeWin()
{
	if( navigator.userAgent.match("Mobile") &&  navigator.userAgent.match("Safari") )
		return;
	
	if(initViewportWidth != document.viewport.getWidth() && initViewportWidth != -1)
	{
//		alert(document.viewport.getWidth() +"!=" +initViewportWidth);
		setTimeout('reloadWIn()', 1);
	}
}

function reloadWIn()
{
	window.document.location.reload(false);
}

function init()
{
	if(!loadedFlag && (loadImgCnt >= loadImgMax))
	{
		setTimeout('init()', 100);
		return;
	}
	
	
	var loadingRoot = $('loadingRoot');
	if(loadingRoot)
	{
		document.body.removeChild(loadingRoot);
	}
	
	
	camera = D3LCameraCreate("camera");
	
	//高速化のため.
	ft_scroll = $("ft_scroll");
	root = $("root");
	debug = $("debug");
	menu = $("menu");
	menuLineL = $("menuLineL");
	
	if(camera)
	{
		var scene = camera.add("main");

		Element.makeClipping("ft_root");
		
		Element.makeClipping("root");
		Element.makeClipping("F1");
		Element.makeClipping("F2");
		Element.makeClipping("F3");
		Element.makeClipping("F4");
		Element.makeClipping("F5");
		Element.makeClipping("f4_screen");
		
		attachD3L(scene, document);

//		scrollbarCamera();

		//カメラの初期位置(スクロールバー).
		var pos = getScrollObj("F1");
		var pos = getScrollObj("footer");
		var h = document.viewport.getHeight();
		scrollY = 3506 - h;
		ft_scroll.scrollTop = scrollY;

//		scrollY = pos[1]  - h/2 + $('footer').getHeight()/2;
//		ft_scroll.scrollTop = pos[1] - h/2 + $('footer').getHeight()/2;
		
		scrollbarCamera();
		scrollEvent();
		
		//fujikawa.
		addMoveObj('para', {y:5000, x:1500 ,ztop:-3000, zbottom:-3000, da:400, finish:'loopPara()'});
		addMoveObj('serifb_2', {y:5000, x:1500 ,ztop:-3000, da:400});
		
		
		f4_screen_disp(0);
		
		WatchCreate('watch1');
		$("watch1").drawnow();
		WatchCreate('watch2');
		$("watch2").drawnow();
		WatchCreate('watch3');
		$("watch3").drawnow();
		WatchCreate('watch4');
		$("watch4").drawnow();
		WatchCreate('watch5');
		$("watch5").drawnow();
		
		serifChoice();
		
		if(navigator.userAgent.indexOf("MSIE") > -1)
		{
			$('leaf').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./imgs/back/leaf1.png',sizingMethod=scale)";
			$('treeFront').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./imgs/back/tree_front.png',sizingMethod=scale)";
			$('treeBack').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./imgs/back/tree_back.png)',sizingMethod=scale)";
			$('sign').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./imgs/back/sign.png)',sizingMethod=scale)";
			$('hato').style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./imgs/back/hato.png)',sizingMethod=scale)";
		}
		else
		{
			$('leaf').style.backgroundImage = "url(./imgs/back/leaf1.png)";
			$('treeFront').style.backgroundImage = "url(./imgs/back/tree_front.png)";
			$('treeBack').style.backgroundImage = "url(./imgs/back/tree_back.png)";
			$('sign').style.backgroundImage = "url(./imgs/back/sign.png)";
			$('hato').style.backgroundImage = "url(./imgs/back/hato.png)";
		}
		

	}

	scrollFocus();
	
//	Event.observe($("ft_scroll"), "scroll", scrollbarCamera);

	Event.observe(root, "focus", scrollFocus);
	Event.observe(root, "mousedown", scrollFocus);
	Event.observe(document, "keydown", scrollFocus);
	Event.observe(window, "keydown", scrollFocus);
	
	initedFlag = true;
	root.style.visibility = "visible";

	//画面の取得.
	initViewportWidth = document.viewport.getWidth();
//	initViewportHeight = document.viewport.getHeight();

}

function scrollFocus()
{
	ft_scroll.focus();
//	print_d("focus");
}

function loopPara()
{
	$('para').setX(1100);
	$('para').setY(-300);
	$('para').setZTop(100);
	$('para').setZBottom(100);
	
	addMoveObj('para', {y:5000, x:1500, ztop:-3000, zbottom:-3000, da:400, finish:'loopPara()'});

	$('serifb_2').setX(1100);
	$('serifb_2').setY(-300);
	$('serifb_2').setZTop(100);
//	$('serifb_2').setZBottom(100);

	addMoveObj('serifb_2', {y:5000, x:1500 ,ztop:-3000, da:400});
}

function serifChoice()
{
	var max = 17;
	for(var ii=1;ii<=max;ii++)
	{
		var obj = $("serifb_" + ii);
		if(obj)
		{
			obj.style.visibility = "hidden";
			for(var ji=0;ji<3;ji++)
			{
				var subobj = $("serif_" + ii + "_" + ji);
				if(subobj)
				{
					subobj.style.visibility = "hidden";
				}
			}
		}
	}
	
	while(true)
	{
		var nextno = parseInt(Math.random() * max) + 1;
		
		var obj = $("serifb_" + nextno);
		if(obj)
		{
			while(true)
			{
				var subno = parseInt(Math.random() * 3);
				var subobj = $("serif_" + nextno + "_" + subno);
				
				if(subobj)
				{
					obj.style.visibility = "visible";
					subobj.style.visibility = "visible";
				}
				break;
			}
			break;
		}
	}
	
	
	
	setTimeout("serifChoice()", 5000);
}

var posTarget = null;
var posTargetOld = null;
var posFlag = true;
var moveObjs = new Array();

function gotoObj(obj)
{
	var pos = getScrollObj(obj);
	gotoXY(pos[0], setFtScrollY(pos[1]));
	
	return false;
}

function setFtScrollY(y)
{
	if(y > ft_scroll.scrollHeight - ft_scroll.getHeight())
		y = ft_scroll.scrollHeight - ft_scroll.getHeight();
	ft_scroll.scrollTop = y;
	
	return y;
}

function checkScrollObj(obj)
{
	var xy = getScrollObj(obj);
	
	if(xy[1] - $(obj).getHeight()/2 <= ft_scroll.scrollTop && ft_scroll.scrollTop <= xy[1] + $(obj).getHeight()/2)
		return true;

	return false;
}

function gotoXY(x, y)
{
	posTarget = new Array(x,y);
	addMoveObj("menu", {y: (y-menu.py + 130), da:20});
	if(posFlag)
	{
		posFlag = false;
		gotoObj_callback();
//		setTimeout("gotoObj_callback()", frameMilli);
	}

	return false;
}

var st = getMilli();
var oldcount = 0;
var starttime = getMilli();

function gotoObj_callback()
{
//	st = getMilli();
	var nowcount = (getMilli() - starttime) / frameInterval;
	
	var pos_flag = true;
	if(posTarget != null)
	{
		var xy = new Array(scrollX, scrollY);
		
		if(posTargetOld != null)
			if(posTargetOld[0] != xy[0] || posTargetOld[1] != xy[1])
			{
				posTarget = null;
				posTargetOld = null;
				return;
			}
		
		var cnt = 0;
		for(var ii=0;ii<nowcount-oldcount;ii++)
		{
			var dpos = new Array((posTarget[0] - xy[0])/3, (posTarget[1] - xy[1])/3);
		
			if(0 < dpos[0] && dpos[0] < 1)
				dpos[0] = 1;
			if(-1 < dpos[0] && dpos[0] < 0)
				dpos[0] = -1;
			if(0 < dpos[1] && dpos[1] < 1)
				dpos[1] = 1;
			if(-1 < dpos[1] && dpos[1] < 0)
				dpos[1] = -1;
			var pos = new Array();
			pos[0] = parseInt(xy[0] + dpos[0]);
			pos[1] = parseInt(xy[1] + dpos[1]);
		
			xy[0] = pos[0];
			xy[1] = pos[1];
			
			cnt ++;
		}
		scrollX = pos[0];
		scrollY = pos[1];
		print_d(cnt);

		
		var xy = new Array(scrollX, scrollY);
		posTargetOld = new Array();
		posTargetOld[0] = xy[0];
		posTargetOld[1] = xy[1];
		
		pos_flag = false;
		if(pos[0] == posTarget[0] && pos[1] == posTarget[1])
		{
			posTarget = null;
			posTargetOld = null;
			pos_flag = true;
		}
		
		scrollbarCamera();
	}
	oldcount = nowcount;

	var all_flag = moveMoveObj();
	
	if(menuLineL.setH)
	{
		menuLineL.setH(3400+(menu._y));
		menuLineL.draw();
	}
//	$("menuLineR").setH(-($("menu")._y));
	
	
	if(pos_flag && all_flag)
	{
		posFlag = true;
	}
	else
	{
		posFlag = false;
		setTimeout("gotoObj_callback()", frameMilli);
	}
//	print_d(avrageMilli(getMilli()-st));
	st = getMilli();
}

function addMoveObj(obj, option)
{
	if(typeof obj == 'string')
		obj = $(obj);
	if(!obj)
		return;
	
	var moveobj = null;
	for(var ii=0;ii<moveObjs.length;ii++)
	{
		if(moveObjs[ii].Panel == obj)
		{
			moveobj = moveObjs[ii];
			break;
		}
	}
	if(moveobj == null)
	{
		moveobj = new D3L.Move();
		moveobj.setPanel(obj);
		moveObjs[moveObjs.length] = moveobj;
	}
	
	if(typeof option.x  != 'undefined')
		moveobj.setX(option.x);
	if(typeof option.y  != 'undefined')
		moveobj.setY(option.y);
	if(typeof option.ztop  != 'undefined')
		moveobj.setZTop(option.ztop);
	if(typeof option.zbottom  != 'undefined')
		moveobj.setZBottom(option.zbottom);
	if(typeof option.w  != 'undefined')
		moveobj.setW(option.w);
	if(typeof option.h  != 'undefined')
		moveobj.setH(option.h);
	if(typeof option.da  != 'undefined')
		moveobj.setDa(option.da);
	if(typeof option.finish  != 'undefined')
		moveobj.setEval(option.finish);

	if(posFlag)
	{
		posFlag = false;
//		gotoObj_callback();
		setTimeout("gotoObj_callback()", frameMilli);
	}
	
	return moveobj;
}

function moveMoveObj()
{
	var temp = moveObjs;
	var allRet = true;
	for(var ii=0;ii<moveObjs.length;ii++)
	{
		var ret = moveObjs[ii].calcNext();
		if(ret)
		{
			var evalstr = moveObjs[ii].evalstr;
			
			moveObjs.splice(ii,1);
			ii--;
			if(evalstr != null)
				eval(evalstr);
		}
		else
		{
			moveObjs[ii].Panel.draw();
			allRet = false;
		}
	}
	
	return allRet;
	
}


function getScrollObj(obj)
{
	obj = $(obj);
	if(!obj)
		return;
	
	//該当オブジェクトの中央絶対座標.
	var pos = Position.cumulativeOffset(obj);
	var x = pos[0] + obj.getWidth()/2;
	var y = pos[1] + obj.getHeight()/2;
	
	//スクロール座標の取得.
	var w = document.viewport.getWidth();
	var h = document.viewport.getHeight();
	
	x = x - w / 2;
	y = y - h / 2;
	
	x += scrollX;
	y += scrollY;
	
	return new Array(parseInt(x), parseInt(y));
}

function attachD3L(scene, obj)
{
	if(typeof obj == 'string')
		obj = $(obj);
	if(!obj)
		return;
	
	var tags = new Array("div", "b", "img", "canvas");
	
	if(obj.getElementsByTagName)
		for(var tagno in tags)
		{
			var tag = tags[tagno];
			var objs = obj.getElementsByTagName(tag);
			for(var ii=0; ii < objs.length; ii++) {
				if(objs[ii].getAttribute("D3L_ZTOP"))
				{
					scene.add(objs[ii]);
				}
			}
		}
}

var f4_screen_flag = false;
function f4_screen_disp($no)
{
	if(!f4_screen_flag)
	{
		addMoveObj("f4_screen", {h: 40, da:10, finish:'f4_screen_disping('+$no+')'});
		if(checkScrollObj('F4'))
			gotoObj('F4');
		f4_screen_flag = true;
	}
}

function f4_screen_disping($no)
{
	for(var ii=0;ii<4;ii++)
		$('f4_screend'+ii).style.display='none';

	$('f4_screend'+$no).style.display='block';
	addMoveObj("f4_screen", {h: $('f4_screen_center').getHeight()+40, da:5, finish:'f4_screen_disped('+$no+')'});
}

function f4_screen_disped($no)
{
	f4_screen_flag = false;
}

function getMilli()
{
	dateObj = new Date();
	h = dateObj.getHours();
	m = dateObj.getMinutes() + 1;
	s = dateObj.getSeconds();
	ms = dateObj.getMilliseconds();	
	return ms + s*1000 + m*60*1000 + h*60*60*1000;
}


function print_d($str)
{
	if(debug)
	{
		debug.innerHTML = $str+"<br/>" + debug.innerHTML;
	}
	
}

function handle(delta)
{
	if(!ft_scroll)
		return;
	
	if (delta < 0)
		// 下方向にまわした場合の処理.
		setFtScrollY(ft_scroll.scrollTop + -delta * 40);
	else
		// 上方向にまわした場合の処理.
		setFtScrollY(ft_scroll.scrollTop + -delta * 40);
}

/** Event handler for mouse wheel event. */
function wheel(event){
	var delta = 0;
	if (!event) /* For IE. */
		event = window.event;
	if (event.wheelDelta) { /* IE/Opera. */
		delta = event.wheelDelta/120;
//		if (window.opera)
//			delta = -delta;
	} else if (event.detail) {
		/** Mozilla case. */
		delta = -event.detail/3;
	}
	/** If delta is nonzero, handle it.
	 * Basically, delta is now positive if wheel was scrolled up,
	 * and negative, if wheel was scrolled down.	  */
	if (delta)
		handle(delta);
	if (event.preventDefault) {
		event.preventDefault();
	}
	event.returnValue = false;
}
/** Initialization code.  
* If you use your own event management code, change it as required. */
if (window.addEventListener)
	 window.addEventListener('DOMMouseScroll', wheel, false);
window.onmousewheel = document.onmousewheel = wheel;

var loadImgCnt = 0;
var loadImgMax = 0;
function cntLoadImg(e)
{
	loadImgCnt++;

	var per = parseInt(100 * loadImgCnt/loadImgMax + 0.5);
	if(per > 100)
		per = 100;
	nowPer = per;

//	drawLoading();
//	print_d(loadImgCnt + "/" + loadImgMax);
	Event.stopObserving(this, "load");
//	this.onload = null;
}

var nowPer = 0;
var oldPer = 0;
function drawLoading(per)
{
	if(per > 100)
		per = 100;
	$('loadBar').style.width = per + "%";
	$('loadBarStr').innerHTML = "Loading " + per + "%";
}

var loadedFlag = false;
var loadPeopleWaku = null;
var loadPeopleTxt = null;
var loadPeoples = new Array();
function addLoadPeople(per, visb)
{
	var w = $('loading').getWidth();
	
	var waku = $("people" + per);
	waku.style.left = w + 'px';
	loadPeoples.push(waku);
	
/*	
	loadPeopleWaku.style.left = w + 'px';
	loadPeopleTxt.innerHTML = per + "%";
	var waku = loadPeopleWaku.cloneNode(true);
//	var waku = loadPeopleWaku;
	waku.id = "people" + per;
	if(!visb)
		waku.style.visibility = "hidden";
	loadPeoples.push(waku);
	$('loading').appendChild(waku);
*/
}

function moveLoadPeople()
{
	var loading = $('loading');
	if(!loading)
		return;

	if(oldPer == 0 && nowPer >= 100)
	{
		loadingFinish();
		return;
	}
	
	if(oldPer == 0)
	{
		var loadingRoot = $('loadingRoot');
		if(loadingRoot)
			loadingRoot.style.visibility = "visible";
	}
	
	if(nowPer > oldPer)
	{
		oldPer++;
		if(oldPer <= 100)
		{
			addLoadPeople(oldPer, (oldPer % 5 == 0));
		}
	}

	if($('loadingBuill').style.visibility == 'hidden')
	{
		$('loadingBuill').style.visibility = 'visible';
		$('loadingBuillS').style.visibility = 'hidden';
	}

	var w = loading.getWidth();
	for(var ii=0;ii<loadPeoples.length;ii++)
	{
		var people = loadPeoples[ii];
		var pid = parseInt(people.id.substring(6,9));
		var px = parseInt(people.style.left.substring(0,people.style.left.indexOf('px')));
		people.style.left = (px - 10) + "px";
		if(px < w/2 + 64)
		{
			if(pid % 5 == 0)
			{
				$('loadingBuill').style.visibility = 'hidden';
				$('loadingBuillS').style.visibility = 'visible';
			}
			drawLoading(pid);
			if(people.id == "people100")
			{
				setTimeout('loadingFinish()', 50);
			}
			$('loading').removeChild(people);
			loadPeoples.splice(ii,1);
			ii--;

//			people.style.display = 'none';
		}
	}
	
	setTimeout('moveLoadPeople()', 50);
}

function loadingFinish()
{
	loadedFlag = true;
	
	var loadingRoot = $('loadingRoot');
	if(loadingRoot)
	{
		document.body.removeChild(loadingRoot);
	}
}


function attachLoadImg()
{
	loadImgCnt = 0;
	loadImgMax = 0;

//	makeLoadPeople();

	var objs = $('root').getElementsByTagName("img");
	loadImgMax = objs.length;
	for(var ii=0; ii < objs.length; ii++) {
		if(objs[ii].complete)
		{
			loadImgCnt++;
//			drawLoading();
		}
		else
		{
			Event.observe(objs[ii], "load", cntLoadImg);
		}
	}

	if(loadImgCnt >= loadImgMax)
	{
		loadingFinish();
	}
	else
		setTimeout('moveLoadPeople()', 50);

}

function makeLoadPeople()
{
	loadPeopleWaku = document.createElement('div');
	loadPeopleWaku.style.position = 'absolute';
	loadPeopleWaku.style.bottom = '0px';
	loadPeopleWaku.style.width = '32px';
//	loadPeopleWaku.style.left = w + 'px';
//	waku.style.left = (w + loadPeoples.length*30) + 'px';
	loadPeopleTxt = document.createElement('div');
	loadPeopleTxt.style.textAlign = 'center';
	loadPeopleTxt.style.backgroundColor = '#FFFFFF';
	loadPeopleTxt.style.width = '100%';
	var img = document.createElement('img');
	img.src = 'imgs/loading/people.gif';
	loadPeopleWaku.appendChild(loadPeopleTxt);
	loadPeopleWaku.appendChild(img);
}

