/*
Charset: UTF-8（京雀）
Version: 20070404
Programing by Masao Takahashi.
*/
function ImageZoomer() {
	this.aConfig = new Array();
	this.ajax = new MyHttpRequest();
	this.isExec = false;
	this.interval = 50; //ミリ秒単位
	this.divide = 8;
}
ImageZoomer.prototype = {
onLoad : function()
{
	for (var j in g_zoomer.aConfig) {
		g_zoomer.execConfig(j);
	}
},
click : function(node)
{//not loaded body
	return false;
},
/*this is old function*/
setConfig : function(imgDir,interval,devide)
{
	g_zoomer.registElementsByClass(false,"zoomable","image",imgDir);
},
registElementsByClass : function(flag, className, mode, dirName)
{
	var config = new Array();
	config.execFlag = false;
	config.mode = mode;
	config.className = className;
	config.dirName = dirName;
	g_zoomer.aConfig.push(config);
	if (flag) g_zoomer.execConfig(g_zoomer.aConfig.length-1);
},
execConfig : function(index)
{
	var config = g_zoomer.aConfig[index];
	if (config.execFlag) return;
	config.execFlag = true;

	addStyleSheet(config.dirName+"/window.css?t="+(new Date().getTime()));
	var list = getElementsByClass(config.className,null,null);
	if (config.mode == 'image') {
		config.thumbList = new Array();
		config.thumbCount = 0;
		for (var i=0; i<list.length; i++) {
			var node = list[i];
			node._config = index;
			node.onclick = g_zoomer.doOpen;
			node.style.cursor = "url('"+config.dirName+"/zoomin.cur'),pointer";
			if (!config.thumbList[node.href]) {
				config.thumbList[node.href] = new Array();
				config.thumbList[node.href].id = config.thumbCount ++;
				config.thumbList[node.href].caption = "";
			}
			var nodeImg = getFirstElement(node);
			if (!nodeImg) continue;
			if (nodeImg.tagName.toLowerCase() != 'img') continue;

			var caption = "";
			var temp = getElementsByClass("caption",node.parentNode,null);
			if (temp.length) caption = temp[0].innerHTML;
			else if (nodeImg.title) caption = nodeImg.title;
		//	else if (nodeImg.alt) caption = nodeImg.alt;
			config.thumbList[node.href].img = nodeImg;
			config.thumbList[node.href].caption = caption;
		}
	}
	else {
		for (var i=0; i<list.length; i++) {
			var node = list[i];
			node._config = index;
			node.onclick = g_zoomer.doOpen;
		}
	}
},
doOpen : function(e)
{
//initialize
	g_zoomer.isZooming = false;
	g_zoomer.close();
	g_zoomer.linkNode = this;
	g_zoomer.href = g_zoomer.linkNode.href;
	g_zoomer.config = g_zoomer.aConfig[g_zoomer.linkNode._config];
//
	if (g_zoomer.config.mode != "image") {
		g_zoomer.thumbImg = document.getElementById("zoom_test");
		if (!g_zoomer.thumbImg) alert('thumb');
	}
	else {
		var thumb = g_zoomer.config.thumbList[g_zoomer.href];
		g_zoomer.thumbID = thumb.id;
		g_zoomer.thumbImg = thumb.img;
	}
	g_zoomer.showLoadMsg();
//set style sheets
	var time = new Date().getTime();
//	g_zoomer.cssWnd  = addStyleSheet(g_zoomer.config.dirName+"/window.css?t="+(new Date().getTime()));
	g_zoomer.cssZoom = addStyleSheet(g_zoomer.config.dirName+"/zooming.css?t="+(new Date().getTime()));
//load format
	g_zoomer.isZooming = true;
	var postdata = new Array();
	var url = g_zoomer.config.dirName+"/window.php?zooming=1";
	g_zoomer.ajax.send(url, postdata, g_zoomer.open_cb1);
	return false;
},
open_cb1 : function()
{
//check ajax status
	var httpReq = g_zoomer.ajax.check();
	if (!httpReq) return;
	var html = httpReq.responseText;
//cancel
	if (!g_zoomer.isZooming) return;
//create zoom window
	html = html.split("<!--%CONTENT%-->")[1];
	var zoomWnd = document.createElement('table');
	zoomWnd.className = "js-zoom-wnd";
	zoomWnd.style.position = "absolute";
	zoomWnd.style.visibility = "hidden";
	zoomWnd.style.borderCollapse = "collapse";
	zoomWnd.style.left = zoomWnd.style.top = "-2000px";
	zoomWnd.style.width = zoomWnd.style.height = "1px";
	var tbody = document.createElement("tbody");
	zoomWnd.appendChild(tbody);
	var tr = document.createElement("tr");
	var td = document.createElement("td");
	td.innerHTML = html;
	tr.appendChild(td);
	tbody.appendChild(tr);
	g_zoomer.zoomWnd = zoomWnd;
	document.body.appendChild(zoomWnd);
//set elements
	var list = zoomWnd.getElementsByTagName('img');
	for (var i=0; i<list.length; i++) {
		var node = list[i];
		var src = node.src;
		if (src) {
			var j = src.lastIndexOf("/");
			if (j >= 0) src = src.substr(j+1);
			node.src = g_zoomer.config.dirName+"/"+src;
		}
	}
	var list = getElementsByClass("caption",zoomWnd,null);
	if (list.length) {
		g_zoomer.caption = list[0];
		g_zoomer.caption.innerHTML = g_zoomer.getCaptionHTML();
	}
	else {
		g_zoomer.caption = null;
	}
//load zoomable image
	var list = getElementsByClass("js-zoomable",zoomWnd,null);
	if (!list.length) {
		return;
	}
	g_zoomer.zoomImg = list[0];
	if (hasClassName(g_zoomer.zoomImg,"js-loadable")) {
		g_zoomer.zoomImg.onload = g_zoomer.open_cb2;
		g_zoomer.zoomImg.src = g_zoomer.href;
	}
	else {
		g_zoomer.startZoom();
	}
},
open_cb2 : function()
{
	if (!g_zoomer.isZooming) return;
	g_zoomer.zoomImg.style.width = g_zoomer.zoomImg.width+"px";
	g_zoomer.zoomImg.style.height = g_zoomer.zoomImg.height+"px";
	g_zoomer.startZoom();
},
close : function()
{
	if (g_zoomer.shadow) {
		var j = g_zoomer.shadow.length;
		for (var i=0; i<j; i++) document.body.removeChild(g_zoomer.shadow.pop());
		g_zoomer.shadow = null;
	}
	if (g_zoomer.iframe) {
		if (g_common._browser == "ie") {
			var oDoc = g_zoomer.iframe.contentWindow.document;
			var _o = oDoc.getElementsByTagName("object");
			var _l = _o.length;
			for (var i = 0; i < _l; i++) {
				_o[i].style.display = "none";
				for (var x in _o[i]) {
					if (typeof _o[i][x] == "function") {
						_o[i][x] = null;
					}
				}
			}
		}
		document.body.removeChild(g_zoomer.iframe);
		g_zoomer.iframe = null;
	}
	if (g_zoomer.zoomWnd) {
		document.body.removeChild(g_zoomer.zoomWnd);
		g_zoomer.zoomWnd = null;
	}
	if (g_zoomer.cssZoom) {
		removeStyleSheet(g_zoomer.cssZoom);
		g_zoomer.cssZoom = null;
	}
	if (g_zoomer.cssWnd) {
		removeStyleSheet(g_zoomer.cssWnd);
		g_zoomer.cssWnd = null;
	}
	return false;
},
startZoom : function()
{
	var zoomWnd = g_zoomer.zoomWnd;
	var zoomImg = g_zoomer.zoomImg;

	g_zoomer.viewRect = getWindowRect();
	g_zoomer.viewRect.grow(-10,-10);
	g_zoomer.hideLoadMsg();
	g_zoomer.maxImgWidth = parseInt(zoomImg.style.width);
	g_zoomer.maxImgHeight = parseInt(zoomImg.style.height);
	if (g_zoomer.caption) {
		g_zoomer.caption.style.width = g_zoomer.maxImgWidth+"px";
	}
	g_zoomer.marginW = zoomWnd.offsetWidth-g_zoomer.maxImgWidth;
	g_zoomer.marginH = zoomWnd.offsetHeight-g_zoomer.maxImgHeight;

	var rect = getElementRect(g_zoomer.thumbImg);
	g_zoomer.stepW = (g_zoomer.maxImgWidth-rect.width)/g_zoomer.divide/2;
	g_zoomer.stepH = (g_zoomer.maxImgHeight-rect.height)/g_zoomer.divide/2;

	var node = zoomImg;
	var marginLeft = 0;
	var marginTop = 0;
	do {
		marginLeft += node.offsetLeft;
		marginTop += node.offsetTop;
		node = node.offsetParent;
	} while (node != zoomWnd && node);
	marginLeft = Math.round(g_zoomer.marginW/2);//ie6 unknown bug

	g_zoomer.wndLeft = rect.left-marginLeft;
	g_zoomer.wndTop = rect.top-marginTop;
	g_zoomer.imgWidth = rect.width;
	g_zoomer.imgHeight = rect.height;
	g_zoomer.adjustWindow();

	zoomWnd.style.visibility = "visible";
	setTimeout(g_zoomer.actionZoom,g_zoomer.interval);
},
actionZoom : function(e)
{
	if (!g_zoomer.isZooming) return;
	var timerFlag = true;
	var stepW = g_zoomer.stepW;
	var stepH = g_zoomer.stepH;
	g_zoomer.imgWidth += stepW*2;
	g_zoomer.imgHeight += stepH*2;
	if (g_zoomer.imgWidth >= g_zoomer.maxImgWidth) {
		g_zoomer.imgWidth = g_zoomer.maxImgWidth;
		g_zoomer.imgHeight = g_zoomer.maxImgHeight;
		timerFlag = false;
	}
	g_zoomer.wndLeft -= stepW;
	g_zoomer.wndTop -= stepH;
	g_zoomer.adjustWindow();
	if (timerFlag) {
		setTimeout(g_zoomer.actionZoom,g_zoomer.interval);
	}
	else {
		removeStyleSheet(g_zoomer.cssZoom);
		g_zoomer.cssZoom = null;
		setTimeout(g_zoomer.endZoom,g_zoomer.interval);
	}
},
endZoom : function(e)
{
	if (!g_zoomer.isZooming) return;
	if (g_zoomer.config.mode == "iframe") {
		var iframe = document.createElement('iframe');
		g_zoomer.iframe = iframe;
		iframe.style.position = "absolute";
		iframe.style.visibility = "hidden";
		iframe.style.overflow = "hidden";//firefox
		iframe.style.border = "none";//firefox
		document.body.appendChild(iframe);
		iframe.src = "";
		if (g_common._browser == 'ie') iframe.onreadystatechange = g_zoomer.onloadFrame;
		else iframe.onload = g_zoomer.onloadFrame;
		iframe.src = g_zoomer.config.dirName+"/window.php";
	}
	else {
		g_zoomer.finishZoom();
	}
},
onloadFrame : function()
{
	if (g_common._browser == 'ie') {
		if (this.readyState != "complete") return;
	}
	if (!g_zoomer.isZooming) return;
//visible iframe
	var iframe = g_zoomer.iframe;
	iframe.style.left = Math.round(g_zoomer.wndLeft)+"px";
	iframe.style.top = Math.round(g_zoomer.wndTop)+"px";
	iframe.style.width = (g_zoomer.imgWidth+g_zoomer.marginW)+"px";
	iframe.style.height = (g_zoomer.imgHeight+g_zoomer.marginH)+"px";
	iframe.style.visibility = "visible";
//change zoomWnd<-iframe
	document.body.removeChild(g_zoomer.zoomWnd);
	g_zoomer.zoomWnd = null;

	//g_zoomer.iframe.contentWindow.onZoomed();
	g_zoomer.finishZoom();
},
finishZoom : function()
{
	var zoomWnd = (g_zoomer.iframe)?g_zoomer.iframe.contentWindow.document:g_zoomer.zoomWnd;
	var list = zoomWnd.getElementsByTagName('a');
	for (var i=0; i<list.length; i++) {
		var node = list[i];
		switch (node.className) {
		case 'js-prev':
			node.onclick = g_zoomer.prev;
			break;
		case 'js-next':
			node.onclick = g_zoomer.next;
			break;
		case 'js-close':
			node.onclick = g_zoomer.close;
			break;
		}
	}
	/*var list = getElementsByClass("replace",zoomWnd,null);
	if (list.length) {
		list[0].style.visibility = "visible";
		g_zoomer.zoomImg.style.visibility = "hidden";
	}*/
//	if (!g_zoomer.iframe)
	zoomWnd.onmousedown = g_zoomer.onDragStart;
/*not supported iframe
	g_zoomer.zoomImg.style.cursor = "url('"+g_zoomer.config.dirName+"/zoomout.cur'),pointer";
	g_zoomer.zoomImg.onclick = g_zoomer.close;
*/
	g_zoomer.drawShadow();
},
adjustWindow : function()
{
	var rect = g_zoomer.viewRect;
	var left = g_zoomer.wndLeft;
	var top = g_zoomer.wndTop;
	var maxLeft = (rect.left+rect.width-g_zoomer.imgWidth-g_zoomer.marginW);
	var maxTop = (rect.top+rect.height-g_zoomer.imgHeight-g_zoomer.marginH);

	if (left < rect.left) left = rect.left;
	else if (left > maxLeft) left = maxLeft;
	if (top < rect.top) top = rect.top;
	else if (top > maxTop) top = maxTop;
	if (top < 0) top = 0;
	g_zoomer.wndLeft = left;
	g_zoomer.wndTop = top;

	g_zoomer.zoomWnd.style.left = Math.round(left)+"px";
	g_zoomer.zoomWnd.style.top = Math.round(top)+"px";
	if (g_zoomer.config.mode == "iframe") {
		g_zoomer.zoomWnd.style.width = (g_zoomer.imgWidth+g_zoomer.marginW)+"px";
		g_zoomer.zoomWnd.style.height = (g_zoomer.imgHeight+g_zoomer.marginH)+"px";
	}
	if (g_zoomer.caption) {
		g_zoomer.caption.style.width = g_zoomer.imgWidth+"px";
	}
	g_zoomer.zoomImg.style.width = g_zoomer.imgWidth+"px";
	g_zoomer.zoomImg.style.height = g_zoomer.imgHeight+"px";
},
prev : function()
{
	if (g_zoomer.thumbID == 0) {
		g_zoomer.thumbID = g_zoomer.config.thumbCount;
	}
	g_zoomer.thumbID --;
	g_zoomer.changeImage();
	return false;
},
next : function()
{
	if (++g_zoomer.thumbID >= g_zoomer.config.thumbCount) {
		g_zoomer.thumbID = 0;
	}
	g_zoomer.changeImage();
	return false;
},
getCaptionHTML : function()
{
	if (g_zoomer.config.thumbList) {
		var thumb = g_zoomer.config.thumbList[g_zoomer.href];
		return thumb.caption;
	}
	return "";
},
changeImage : function()
{
	var thumb = null;
	var list = g_zoomer.config.thumbList;
	for (var href in list) {
		if (list[href].id == g_zoomer.thumbID) {
			thumb = list[href];
			g_zoomer.href = href;
			g_zoomer.thumbImg = thumb.img;
			break;
		}
	}
	if (thumb == null) return;

	var zoomImg = g_zoomer.zoomImg;
	zoomImg.style.visibility = "hidden";

	g_zoomer.showClock();
	if (g_zoomer.caption) {
		g_zoomer.caption.innerHTML = g_zoomer.getCaptionHTML();
	}
	g_zoomer.zoomImg.onload = g_zoomer.changeImage_cb;
	g_zoomer.zoomImg.src = href;
},
changeImage_cb : function(e)
{
	if (!g_zoomer.isZooming) return;
	g_zoomer.hideClock();
	g_zoomer.zoomImg.style.width = g_zoomer.zoomImg.width+"px";
	g_zoomer.zoomImg.style.height = g_zoomer.zoomImg.height+"px";
	g_zoomer.zoomImg.style.visibility = "visible";
	g_zoomer.drawShadow();
},
showLoadMsg : function()
{
	if (!g_zoomer.thumbImg) {
		return;
	}
	if (!g_zoomer.loadMsg) {
		var loadMsg = document.createElement('div');
		g_zoomer.loadMsg = loadMsg;
		loadMsg.className = "js-zoom-msg";
		loadMsg.style.position = "absolute";
		loadMsg.innerHTML = 'LOADING...';
		document.body.appendChild(loadMsg);
	}
	else {
		var loadMsg = g_zoomer.loadMsg;
	}
	var rect = getElementRect(g_zoomer.thumbImg);
	loadMsg.style.left = rect.left+Math.round((rect.width-loadMsg.offsetWidth)/2)+"px";
	loadMsg.style.top = rect.top+Math.round((rect.height-loadMsg.offsetHeight)/2)+"px";
},
hideLoadMsg : function()
{
	if (g_zoomer.loadMsg) {
		document.body.removeChild(g_zoomer.loadMsg);
		g_zoomer.loadMsg = null;
	}
},
showClock : function()
{
	var zoomImg = g_zoomer.zoomImg;
	var left = Math.round(zoomImg.offsetWidth/2)-16;
	var top = Math.round(zoomImg.offsetHeight/2)-16;
	if (!g_zoomer.clockImg) {
		var clockImg = document.createElement('img');
		g_zoomer.clockImg = clockImg;
		clockImg.style.position = "absolute";
		clockImg.style.left = left+"px";
		clockImg.style.top = top+"px";
		clockImg.src = g_zoomer.config.dirName+"/loading.gif";
		zoomImg.parentNode.style.position = "relative";
		zoomImg.parentNode.appendChild(clockImg);
	}
	else {
		var clockImg = g_zoomer.clockImg;
		clockImg.style.left = left+"px";
		clockImg.style.top = top+"px";
	}
},
hideClock : function()
{
	if (g_zoomer.clockImg) {
		if (g_zoomer.zoomImg) {
			g_zoomer.zoomImg.parentNode.removeChild(g_zoomer.clockImg);
		}
		g_zoomer.clockImg = null;
	}
},
drawShadow : function()
{
	var zoomWnd = (g_zoomer.iframe)?g_zoomer.iframe:g_zoomer.zoomWnd;
	var left = parseInt(zoomWnd.style.left) - 10;
	var top = parseInt(zoomWnd.style.top) - 10;
	var width = zoomWnd.offsetWidth - 20;
	var height = zoomWnd.offsetHeight - 20;

	var config = new Array(
		new Array(left, top, 20, 20, "t1.png", "no-repeat"),
		new Array(left+20, top, width, 10, "t2.png", "repeat-x"),
		new Array(left+20+width, top, 20, 20, "t3.png", "no-repeat"),

		new Array(left, top+20, 10, height, "l.png", "repeat-y"),
		new Array(left+30+width, top+20, 10, height, "r.png", "repeat-y"),

		new Array(left, top+20+height, 20, 20, "b1.png", "no-repeat"),
		new Array(left+20, top+30+height, width, 10, "b2.png", "repeat-x"),
		new Array(left+20+width, top+20+height, 20, 20, "b3.png", "no-repeat")
	);
	var _ie = (g_common._browser == 'ie');
	var _ie7over = _ie && (parseInt(g_common._version)>=7);
	var flagNew = false;
	if (!g_zoomer.shadow) {
		flagNew = true;
		g_zoomer.shadow = new Array(8);
	}
	for (var i = 0; i < 8; i++) {
		var param = config[i];
		if (flagNew) {
			var node = document.createElement('div');
			node.style.className = "js-effect";
			node.style.position = "absolute";
			g_zoomer.shadow[i] = node;
		}
		else {
			var node = g_zoomer.shadow[i];
		}
		node.style.left = param[0]+"px";
		node.style.top  = param[1]+"px";
		node.style.width  = param[2]+"px";
		node.style.height = param[3]+"px";
		if (_ie) {
			if (param[3] == 10) {
				node.style.fontSize = 0;
				node.style.lineHeight = "10px";
			}
		}
		var url = g_zoomer.config.dirName+"/"+param[4];
		if (_ie && !_ie7over) {
			node.style.backgroundColor = "transparent";
			if (param[5].match(/^no-/)) {
				node.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader("+
					"enabled=true, sizingMethod=image src='"+url+"')";
			}
			else {
				node.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader("+
					"enabled=true, sizingMethod=scale src='"+url+"')";
			}
		}
		else {
			node.style.background = "url('"+url+"') 0 0 "+param[5];
		}
		if (flagNew) document.body.appendChild(node);
		node.style.visibility = "visible";
	}
},
getEventPt : function(e, flag)
{
	if (document.all) {
		var evt = (flag) ? g_zoomer.iframe.contentWindow.event : window.event;
		var offsetX = document.documentElement.scrollLeft;
		var offsetY = document.documentElement.scrollTop;
		if (g_common._browser == "opera") {
			offsetX = offsetY = 0;
		}
		return {x:evt.screenX+offsetX, y:evt.screenY+offsetY};
	}
	else {
		var offsetX = window.scrollX;
		var offsetY = window.scrollY;
		return {x:e.screenX+offsetX, y:e.screenY+offsetY};
	}
},
onDragStart : function(e)
{
	if (hasClassName(getEventTarget(e),"js-nodrag")) {
		return true;
	}
	var target = (g_zoomer.iframe)?g_zoomer.iframe:g_zoomer.zoomWnd;
	var pt = g_zoomer.getEventPt(e, (g_zoomer.iframe));
	target.eX = pt.x;
	target.eY = pt.y;
	target.style.cursor = "move";
	if (g_zoomer.iframe) {
		g_zoomer.iframe.contentWindow.document.onmousemove = g_zoomer.onDragMove;
		g_zoomer.iframe.contentWindow.document.onmouseup = g_zoomer.onDragEnd;
	}
	if (g_common._browser == "ie") {
		window.onscroll = g_zoomer.onDragMove;
	}
	document.onmousemove = g_zoomer.onDragMove;
	document.onmouseup = g_zoomer.onDragEnd;
	var j = g_zoomer.shadow.length;
	for (var i=0; i<j; i++) {
		g_zoomer.shadow[i].style.visibility = "hidden";
	}
	target._minX = target._minY = 10;
	target._maxX = document.body.offsetWidth-target.offsetWidth-10;
	target._maxY = document.body.offsetHeight-target.offsetHeight-10;
	return false;
},
onDragMove : function(e)
{
	var target = (g_zoomer.iframe)?g_zoomer.iframe:g_zoomer.zoomWnd;
	var pt = g_zoomer.getEventPt(e, (this!=document));
	var left = parseInt(target.style.left)+pt.x-target.eX;
	var top  = parseInt(target.style.top)+pt.y-target.eY;
	if (top < target._minY) { top = target._minY; }
	else if (top > target._maxY) { top = target._maxY; }
	if (left < target._minX) { left = target._minX; }
	else if (left > target._maxX) { left = target._maxX; }
	target.style.left = left+"px";
	target.style.top = top+"px";
	target.eX = pt.x;
	target.eY = pt.y;
	return false;
},
onDragEnd : function(e)
{
	var target = (g_zoomer.iframe)?g_zoomer.iframe:g_zoomer.zoomWnd;
	target.style.cursor = "";
	window.onscroll = null;
	document.onmousemove = null;
	document.onmouseup  =null;
	if (g_zoomer.iframe) {
		g_zoomer.iframe.contentWindow.document.onmousemove = null;
		g_zoomer.iframe.contentWindow.document.onmouseup = null;
	}
	g_zoomer.drawShadow();
	return false;
}
};
var g_zoomer = new ImageZoomer();
g_common.registInterface(g_zoomer);
