///////////////////////////////////////////////////////////////////////////
//
//  Copyright 2008 SEKIOUSOFT All Rights Reserved
//
///////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////
//　
//  ほぼ自作の○oogleMapチックなjavascriptです。
//  商用ですので、ソースは流用しないようお願い申し上げます。
//　
///////////////////////////////////////////////////////////////////////////
var OUTER_BACKGROUND_MAX = 3;
var zoomper		= 1.1;
var stok		= 1;
var $zoommax	= 3;
var isinit = 0;
var min_left	= 0;
var min_top		= 0;

var zoomplusy = 0;
var zoomplusx = 0;
var isprocess = 0;
var oldzoom = 0;
var zoom    = 0;
var zoomsizes;
var tilesizesX;
var tilesizesY;

var nowzoomx = 0;
var nowzoomy = 0;

var zoomdeltax = 0;
var zoomdeltay = 0;


var timePos = 1;
var totalTime = 5;

var tileSizeX;
var tileSizeY;
var nowtileSizeX;
var nowtileSizeY;
var oldtileSizeX;
var oldtileSizeY;


var tiledeltaX = 0;
var tiledeltaY = 0;

var interval = null;

var dragging = false;
var w_top  = 0;
var left = 0;
var dragStartTop  = 0;
var dragStartLeft = 0;

var tilesX = 0;
var tilesY = 0;

var pictreqcgi = "";
var innerdiv = "innerdiv";
var outerdiv = "outerdiv";
var fixdiv = "fixdiv";

var viewportWidth   = 600;
var viewportHeight  = 600;

var maxpos_x = 0;
var maxpos_y = 0;

var move_oldposx = 0;
var move_oldposy = 0;

var REQUEST_NONE = 0;
var REQUEST_BUSY = 1;
var REQUEST_MORE = 2;

var isRequest = REQUEST_NONE;
var nowTileIndexX = 0;
var nowTileIndexY = 0;
var oldTileIndexX = 0;
var oldTileIndexY = 0;

var startX = 0;
var startY = 0;

var toppx  = 0; //実際の左上座標
var leftpx = 0;

var strreqcgi = null;

var fulltileX = 0;
var fulltileY = 0;

var mouseposX = 0;
var mouseposY = 0;

var navigateurl = "";

var cartpaddingX = 15;
var cartpaddingY = 15;

var cartName = "script_cart";
var cartImg  = "script_cartImg";

var SCROLLUP_OK    = 0x01;
var SCROLLDOWN_OK  = 0x02;
var SCROLLLEFT_OK  = 0x04;
var SCROLLRIGHT_OK = 0x08;

var scrollmark_left  = "scrollmark_left";
var scrollmark_right = "scrollmark_right";
var scrollmark_up    = "scrollmark_up";
var scrollmark_down  = "scrollmark_down";

var flamenum = 0;
var PHOTOKIND;
var MAPORDER;

var INFOTEXT = new Array();
var LASTREQ_START     = -1;
var LASTREQ_PHOTOKIND = -1;
var	LASTREQ_MAPORDER  = -1;


function getVisibleTiles()
{
	//マップのタイル設定
	var mapX	= stripPx(Element.getStyle(innerdiv,"left"));
	var mapY	= stripPx(Element.getStyle(innerdiv,"top"));
	startX		= Math.floor(Math.abs(mapX / nowtileSizeX));
	startY		= Math.floor(Math.abs(mapY / nowtileSizeY));
	if(startX < 0){startX = 0;}
	if(startY < 0){startY = 0;}
	var visibleTileArray = [];
	var counter = 0;
	var endX = tilesX + startX + stok;
	var endY = tilesY + startY + stok;
	for(x = startX;x < endX;++x){
		for(y = startY;y < endY;++y){
			visibleTileArray[counter++] = [x,y];
		}
	}
	return visibleTileArray;
}
function cartconfirm(event)
{
	return confirm("カートに入れてもよろしいですか？");
}

function oMO(e)
{
	var responseText = e.target.id;
	var tileArray    = responseText.split(',');
	nowTileIndexX    = parseInt(tileArray[0],10);
	nowTileIndexY    = parseInt(tileArray[1],10);
	var left         = (nowTileIndexX * nowtileSizeX);
	var top          = (nowTileIndexY * nowtileSizeY);
	var cart         = $(cartName);
	cart.style.left  = ( left + cartpaddingX ) + "px";
	cart.style.top   = ( top  + cartpaddingY ) + "px";
	getText(false);

}


function checkTiles()
{
	var visibleTiles = getVisibleTiles();
	var o_innerdiv = $(innerdiv);
	var visibleTilesMap = {};
	var tileLen = visibleTiles.length;
	var cart = $(cartName);
	if(!cart){
		var cartimg	 = document.createElement("img");
		cartimg.src = "http://fukuyamanet.com/tyukogame/incart.gif";
		cartimg.setAttribute("id",cartImg);
		cartimg.style.display="none";
		cart	  = document.createElement("a");
		cart.setAttribute("id",cartName);
		cart.style.position="absolute";
		cart.appendChild(cartimg);
		cart.style.zIndex="1";
		cart.onclick = cartconfirm;
		o_innerdiv.appendChild(cart);
	}
	visibleTilesMap[cartName] = true;
	visibleTilesMap[scrollmark_left] = true;
	visibleTilesMap[scrollmark_right] = true;
	visibleTilesMap[scrollmark_up] = true;
	visibleTilesMap[scrollmark_down] = true;


	for(i = 0;i < tileLen;i++){
		var tileArray = visibleTiles[i];
		var start = getExGetImgStart(tileArray[0],tileArray[1]);
		var tileName  = tileArray[0] + "," + tileArray[1]; 
		var fileName  = "?start=" + start + "&photokind=" + PHOTOKIND + "&maporder=" + MAPORDER;
		visibleTilesMap[tileName] = true;
		var img = $(tileName);
		var isNothing = false;
		if(!img){
			img = document.createElement("img");
			img.src = pictreqcgi + fileName;
			img.style.position="absolute";
			img.style.zIndex="0";
			img.style.backgroundImage="url(http://fukuyamanet.com/tyukogame/nosample.gif)";
			img.style.backgroundRepeat="repeat";
			isNothing = true;
		}
		var left  = (tileArray[0] * nowtileSizeX);
		var top   = (tileArray[1] * nowtileSizeY);
		img.style.left = left + "px";
		img.style.top  = top + "px";
		img.style.width = nowtileSizeX + "px";
		img.style.height= nowtileSizeY + "px";
		if(typeof event != "undefined"){
			if(	event != null && event.x != null && event.y != null &&
				left < event.x  &&
				left + nowtileSizeX > event.x &&
				top  < event.y &&
				top  + nowtileSizeY > event.y ){
				nowTileIndexX = tileArray[0];
				nowTileIndexY = tileArray[1];
				cart.style.left = ( left + cartpaddingX ) + "px";
				cart.style.top  = ( top  + cartpaddingY ) + "px";
			}
		}
		if(isNothing){
			img.id = tileName;
			if(typeof event == "undefined"){
				img.onmouseover=oMO;
			}
			o_innerdiv.appendChild(img);
		}
	}
	var idx = 0;
	while(o_innerdiv.childNodes[idx]){
		if(!visibleTilesMap[o_innerdiv.childNodes[idx].id]){
			o_innerdiv.removeChild(o_innerdiv.childNodes[idx]);
		}else{
			++idx;
		}
	}
}




function allTileDelete()
{
	var o_innerdiv = $(innerdiv);
	while(o_innerdiv.firstChild){
		o_innerdiv.removeChild(o_innerdiv.firstChild);
	}
}

function isNum(str)
{
	var num = parseInt(str);
	if(isNaN(num)){return 0;}
	return 1;
}
function textchange(text,target,idxmax)
{
	var tmpobj;
	for(i = 0;i < idxmax;++i){
		tmpobj = $(text + i);
		if(tmpobj){
			if(i == target){
				tmpobj.style.color="silver";
			}else{
				tmpobj.style.color="blue";
			}
		}
	}
}


function onOrderChange(order,idxmax)
{
	if(	isNum(order) == 0 || isNum(idxmax) == 0 || order < 0){
		return;
	}
	MAPORDER  = order;
	onloadwork();
	textchange("ss_order_",order,idxmax);
	allTileDelete();
	checkTiles();
}
function onPhotoChange(photo,idxmax)
{
	if(	isNum(photo) == 0 || isNum(idxmax) == 0 || photo < 0 ){
		return;
	}
	PHOTOKIND = photo;
	onloadwork();
	textchange("ss_photo_",photo,idxmax);
	allTileDelete();
	checkTiles();
}

var myTim = 0;
function bodyonload(pictreq,strreq,mw,mh,mtx,mty,photokind,maporder)
{
	PHOTOKIND= photokind;
	MAPORDER = maporder;

	strreqcgi   = strreq;
	pictreqcgi	= pictreq;
	zoomsizes	= new Array($zoommax);
	tilesizesX	= new Array($zoommax);
	tilesizesY	= new Array($zoommax);
	for(i = 0;i < $zoommax;++i){
		zoomsizes[i] = new Array(2);
	}
	zoomsizes[0][0] = mw;
	for(i = 1;i < $zoommax;++i){
		zoomsizes[i][0] = zoomsizes[i - 1][0] * zoomper;
	}
	zoomsizes[0][1] = mh;
	for(i = 1;i < $zoommax;++i){
		zoomsizes[i][1] = zoomsizes[i - 1][1] * zoomper;
	}
	tilesizesX[0] = mtx;
	tilesizesY[0] = mty;
	for(i = 1;i < $zoommax;++i){
		tilesizesX[i] = tilesizesX[i - 1] * zoomper;
		tilesizesY[i] = tilesizesY[i - 1] * zoomper;
	}
	nowzoomx = zoomsizes[zoom][0];
	nowzoomy = zoomsizes[zoom][1];
	tileSizeX  = tilesizesX[0];
	tileSizeY  = tilesizesY[0];
	nowtileSizeX = tileSizeX;
	nowtileSizeY = tileSizeY;
	oldtileSizeX = tileSizeX;
	oldtileSizeY = tileSizeY;
	fulltileX = Math.ceil(mw /nowtileSizeX) + stok;
	fulltileY = Math.ceil(mh /nowtileSizeY) + stok;

	$(outerdiv).onmouseover = onloadwork;


}

function onloadwork(event)
{
	if(isinit == 1){return;}
	isinit = 1;

	onZoomChange();
	Element.setStyle(outerdiv,{width:viewportWidth+"px",height:viewportHeight+"px"});
	var o_outerdiv = $(outerdiv);
	o_outerdiv.onmousedown   = startMove;
	document.onmousemove     = processMove;
	o_outerdiv.onmouseup     = stopMove;
	o_outerdiv.ondblclick    = toggleMove;
	o_outerdiv.oncontextmenu = contextMenu;
	var rndnum = Math.floor( Math.random() * OUTER_BACKGROUND_MAX ); 
	o_outerdiv.style.backgroundImage='url(http://fukuyamanet.com/tyukogame/nowloading'+ rndnum +'.jpg)';
	interval  = setInterval("getText(true)", 5000);
	checkTiles();

	var markleft  = $(scrollmark_left);
	var markright = $(scrollmark_right);
	var markup    = $(scrollmark_up);
	var markdown  = $(scrollmark_down);

	markleft  = document.createElement("img");
	markleft.src = "http://fukuyamanet.com/icon/tr_left.gif";
	markleft.setAttribute("id",scrollmark_left);
	markleft.style.position="absolute";
	markleft.style.zIndex="1";
	markleft.style.left = "10px";
	markleft.style.top  = (viewportHeight / 2 ) + "px";
	markleft.style.display = "none";

	markright = document.createElement("img");
	markright.src = "http://fukuyamanet.com/icon/tr_right.gif";
	markright.setAttribute("id",scrollmark_right);
	markright.style.position="absolute";
	markright.style.zIndex="1";
	markright.style.right = "10px";
	markright.style.top  = (viewportHeight / 2 ) + "px";
	markright.style.display = "block";

	markup    = document.createElement("img");
	markup.src = "http://fukuyamanet.com/icon/tr_up.gif";
	markup.setAttribute("id",scrollmark_up);
	markup.style.position="absolute";
	markup.style.zIndex="1";
	markup.style.left = (viewportWidth / 2 ) + "px";
	markup.style.top  = "10px";
	markup.style.display = "none";

	markdown  = document.createElement("img");
	markdown.src = "http://fukuyamanet.com/icon/tr_down.gif";
	markdown.setAttribute("id",scrollmark_down);
	markdown.style.position="absolute";
	markdown.style.zIndex="1";
	markdown.style.left   = (viewportWidth / 2 ) + "px";
	markdown.style.bottom = "10px";
	markdown.style.display = "block";

	o_outerdiv.appendChild(markright);
	o_outerdiv.appendChild(markleft);
	o_outerdiv.appendChild(markup);
	o_outerdiv.appendChild(markdown);

}





function contextMenu(event)
{
	return false;
}

function startMove(event)
{
	if(!event){event = window.event;}
	if(isprocess == 1){
		return false;
	}
	if(dragging == false){
		dragging = true;
		if(!event){return false;}
		move_oldposx = event.clientX;
		move_oldposy = event.clientY;
		startMoveWork();
	}
	return false;
}
function processMove(event)
{
	if(!event){event = window.event;}
	if(dragging){
		move_oldposx = event.clientX;
		move_oldposy = event.clientY;
		++flamenum;
		processMoveWork();
		if(flamenum % 20 == 0){
			checkTiles();
		}
	}else{
		if(++flamenum % 3 == 0){
			checkTiles();
			getText(false);
		}
	}
	return false;
}

function startMoveWork()
{
	dragStartLeft=move_oldposx;
	dragStartTop =move_oldposy;
	$(innerdiv).style.cursor = "move";
	w_top   = stripPx(Element.getStyle(innerdiv,"top"));
	left  = stripPx(Element.getStyle(innerdiv,"left"));
}

function processMoveWork()
{
	toppx  = (w_top+(move_oldposy - dragStartTop)) - zoomplusy;
	var markleft  = $(scrollmark_left);
	var markright = $(scrollmark_right);
	var markup    = $(scrollmark_up);
	var markdown  = $(scrollmark_down);
	if(toppx   < maxpos_y){
		toppx  = maxpos_y;
		markup.style.display="block";
		markdown.style.display="none";
	}else if(toppx > min_top){
		toppx = min_top;
		markup.style.display="none";
		markdown.style.display="block";
	}else{
		markup.style.display="block";
		markdown.style.display="block";
	}
	leftpx = (left+(move_oldposx - dragStartLeft)) - zoomplusx;
	if(leftpx  < maxpos_x){
		markleft.style.display="block";
		markright.style.display="none";
		leftpx = maxpos_x;
	}else if(leftpx > min_left){
		leftpx = min_left;
		markleft.style.display="none";
		markright.style.display="block";
	}else{
		markleft.style.display="block";
		markright.style.display="block";
	}
	$(innerdiv).style.top  = toppx + "px";
	$(innerdiv).style.left = leftpx + "px";
}

function stopMove(event)
{
	if(dragging == true){
		stopMoveWork();
	}
	return false;
}

function stopMoveWork()
{
	dragging=false;
	$(innerdiv).style.cursor = "hand";
}

function stripPx(value)
{
	if(value=="") return 0;
	return parseFloat(value.substring(0,value.length - 2));
}

function assignSuccess(responseText)
{
	INFOTEXT["S_"+ LASTREQ_START + "_P_" + LASTREQ_PHOTOKIND + "_O_" + LASTREQ_MAPORDER] = responseText;
	textSetWork();
	if(isRequest == REQUEST_MORE){
		checkTiles();
		getTextWork(false);
	}
	isRequest = REQUEST_NONE;
}

function textSetWork()
{
	var responseText = INFOTEXT["S_"+ LASTREQ_START + "_P_" + LASTREQ_PHOTOKIND + "_O_" + LASTREQ_MAPORDER];
	var textarray = responseText.split(',');
	navigateurl = textarray[0];
	var carturl = textarray[1];
	var goodsnamedisp = document.getElementById("goodsnamedisp");
	goodsnamedisp.innerHTML = textarray[2];
	var cartimg = $(cartImg);
	var cart    = $(cartName);
	if(cartimg){
		if(carturl == ""){
			cartimg.style.display="none";
			cart.href = "#";
		}else{
			cartimg.style.display="inline";
			cart.href = carturl;
		}
	}

}


function toggleMove(event)
{
	if(navigateurl != "" && confirm("詳細ページに移動してもよろしいですか？")){
		document.location.href=navigateurl;
	}
}

function assignError(responseText)
{
	isRequest = REQUEST_NONE;
	LASTREQ_START     = -1;
}
function assignException(responseText)
{
	isRequest = REQUEST_NONE;
	LASTREQ_START     = -1;
}

function getTextWork(force)
{
	oldTileIndexX = nowTileIndexX;
	oldTileIndexY = nowTileIndexY;
	var start = getExGetImgStart(nowTileIndexX,nowTileIndexY);
	LASTREQ_START     = start;
	LASTREQ_PHOTOKIND = PHOTOKIND;
	LASTREQ_MAPORDER  = MAPORDER;
	if(!force && INFOTEXT["S_"+ LASTREQ_START + "_P_" + LASTREQ_PHOTOKIND + "_O_" + LASTREQ_MAPORDER]){
		textSetWork();
		return;
	}
	isRequest = REQUEST_BUSY;
	//カーソル位置に対応する画像指定の更新
	new Ajax.Request(strreqcgi,
	{
		asynchronous:true,
		"method":"post",
		"parameters":"start="+start+"&photokind=" + PHOTOKIND + "&maporder=" + MAPORDER ,
		onSuccess:function(request)			{assignSuccess(request.responseText);},
		onFailure:function(request)			{assignError(request.responseText);},
        onException:function (transport, ex){assignException(ex.message)}
	});
}
function getText(force)
{
	if(	!force &&
		oldTileIndexX == nowTileIndexX &&
		oldTileIndexY == nowTileIndexY){
		return;
	}
	if(isRequest != REQUEST_NONE){
		isRequest = REQUEST_MORE;
		return;
	}
	getTextWork(force);
}


function getExGetImgStart(X,Y)
{
	return (fulltileX * Y) + X;
}


//function toggleZoom(event)
//{
//	if(isprocess == 1){
//		return;
//	}
//	oldzoom = zoom;
//	if(++zoom >= zoomsizes.length){zoom=0;}
//	toggleZoomWork();
//}

//function toggleZoomWork()
//{
//	zoomdeltax  = Math.ceil((zoomsizes[zoom][0] - zoomsizes[oldzoom][0]) / totalTime);
//	zoomdeltay  = Math.ceil((zoomsizes[zoom][1] - zoomsizes[oldzoom][1]) / totalTime);
//	tiledeltaX  = Math.ceil((tilesizesX[zoom] - tilesizesX[oldzoom]) / totalTime);
//	tiledeltaY  = Math.ceil((tilesizesY[zoom] - tilesizesY[oldzoom]) / totalTime);
//
//	interval    = setInterval("zoomWork()", 15);
//	onZoomChange();
//	processMoveWork();
//	isprocess = 1;
//}


//function zoomWork(element)
//{
//	nowzoomx = Math.ceil(zoomsizes[oldzoom][0] + (zoomdeltax * timePos));
//	nowzoomy = Math.ceil(zoomsizes[oldzoom][1] + (zoomdeltay * timePos));
//
//	zoomplusx = Math.ceil(((nowzoomx/2 ) - (zoomsizes[oldzoom][0]/ 2))  / 2);
//	zoomplusy = Math.ceil(((nowzoomy/2 ) - (zoomsizes[oldzoom][1]/ 2))  / 2);
//
//	nowtileSizeX = oldtileSizeX + (tiledeltaX * timePos);
//	nowtileSizeY = oldtileSizeY + (tiledeltaY * timePos);
//	onZoomChange();
//	processMoveWork();
//	++timePos;
//	if(timePos > totalTime && interval != null){
//		clearInterval(interval);
//		interval = null;
//		timePos = 1;
//		if(zoom == 0){
//			nowtileSizeX = tileSizeX;
//			nowtileSizeY = tileSizeY;
//		}
//		oldtileSizeX = nowtileSizeX;
//		oldtileSizeY = nowtileSizeY;
//		isprocess = 0;
//		zoomplusy = 0;
//		zoomplusx = 0;
//	}
//}


function onZoomChange()
{
	maxpos_y = viewportHeight - nowzoomy;
	maxpos_x = viewportWidth  - nowzoomx;
	tilesX = Math.ceil(viewportWidth /nowtileSizeX) + stok;
	tilesY = Math.ceil(viewportHeight/nowtileSizeY) + stok;
	stopMoveWork();
}



//"{url|default|auto|crosshair|pointer|move|e-resize|ne-resize|nw-resize|n-resize|se-resize|sw-resize|s-resize|w-resize|text|wait|help}" 

