var mouse_over, onmousewheel_initialize;

function imagepopup8_initialize(PARAMS){
	var USER_AGENT_PARSER_IE = new RegExp("MSIE ([0-9])");
	var USER_AGENT_PARSER_FIREFOX = new RegExp("Firefox");
	var USER_AGENT_PARSER_SAFARI = new RegExp("Safari");
	var USER_AGENT_PARSER_GECKO = new RegExp("Gecko");
	var USER_AGENT_PARSER_OPERA = new RegExp("Opera");
	var USER_AGENT_PARSER_KONQUEROR = new RegExp("Konqueror");

	var FADE_STOP = 0;
	var FADE_IN   = 1;
	var FADE_OUT  = 2;
	
	var IMAGE_URL         = 0;
	var IMAGE_WIDTH       = 1;
	var IMAGE_HEIGHT      = 2;
	var IMAGE_CAPTION     = 3;
	var IMAGE_MP_TOTAL    = 4;
	var IMAGE_MP_INDEX    = 5;
	var IMAGE_SRC_ELEMENT = 6;

	var HI_DATA     = 0;
	var HI_ELEMENT  = 1;
	var HI_ALPHA    = 2;
	var HI_LOADED   = 3;
	var HI_INTERVAL = 4;
	var HI_FADE     = 5;

	var UA_NOT_SUPPORTED = 0;
	var UA_IE6           = 1;
	var UA_IE7           = 2;
	var UA_IE8           = 3;
	var UA_FIREFOX       = 4;
	var UA_SAFARI        = 5;
	var UA_GECKO         = 6;
	var UA_OPERA         = 7;
	var UA_KONQUEROR     = 8;
	
	var gWindowFade = FADE_STOP;
	var gWindowAlpha = 1;
	
	var gStartLeft   = 0;
	var gStartTop    = 0;
	var gStartWidth  = 100;
	var gStartHeight = 100;
	
	var gCurrentLeft   = 0;
	var gCurrentTop    = 0;
	var gCurrentWidth  = 100;
	var gCurrentHeight = 100;
	
	var gPreferedLeft   = null;
	var gPreferedTop    = null;
	var gPreferedWidth  = null;
	var gPreferedHeight = null;
	
	var gMoveProgress = 0;
	
	var gEvent;
	var gSrcElement;
	var gMouseX;
	var gMouseY;

	var gNotSupported  = false;
	var gUserAgent     = null;
	
	var gTimerEnabled = false;
	var gLastTime = null;
	
	var gHoverWindow    = null;
	var gHoverCaption  = null;
	var gHoverBackground  = null;
	var gHoverImages = new Array();


	function start_timer(){
		if(!gTimerEnabled){
			set_timer();
			gTimerEnabled = true;
		}
	}
	
	function set_timer(){
		setTimeout(timer_tick,PARAMS.Interval);
		gLastTime = new Date().getTime();
	}
	
	function clear_timer(){
		gTimerEnabled = false;
	}
	
	function renew_hover_image_array(){
		var newHoverImages = new Array();
		for(var i = 0;i < gHoverImages.length; i ++){
			var hoverImage = gHoverImages[i];
			if(hoverImage[HI_ELEMENT] != null){
				newHoverImages.push(hoverImage);
			}
		}
		gHoverImages = newHoverImages;
	}
	function to_hex(d){
		d = Math.round(d);
		if(d >= 255){
			return "ff";
		}else if(d <= 15){
			return "0" + d.toString(16);
		}else{
			return d.toString(16);
		}
	}
	
	var gNowLoadingCounter = 0;
	var NOW_LOADING_COUNT = 800;
	var NOW_LOADING_COUNT_RATIO = Math.PI / NOW_LOADING_COUNT;
	
	function make_color(r,g,b){
		return "#" + to_hex(r) + to_hex(g) + to_hex(b);
	}
	
	function set_inner_alpha(element, alpha){
		if(alpha > gWindowAlpha){
			set_alpha(element, gWindowAlpha);
		}else{
			set_alpha(element, alpha);
		}
	}
	
	function timer_tick(){
		clear_timer();
		if(gHoverWindow != null){
			var now = new Date().getTime();
			var interval = now - gLastTime;
			gLastTime = now;
			
			gMoveProgress += interval;
			if(gMoveProgress > PARAMS.MoveInterval){
				gMoveProgress = PARAMS.MoveInterval;
			}
			
			//移動関数の返値代わり
			var ended = true;
			var progress = gMoveProgress / PARAMS.MoveInterval;
			gCurrentLeft   = gStartLeft   + (gPreferedLeft   - gStartLeft  ) * progress;
			gCurrentTop    = gStartTop    + (gPreferedTop    - gStartTop   ) * progress;
			gCurrentWidth  = gStartWidth  + (gPreferedWidth  - gStartWidth ) * progress;
			gCurrentHeight = gStartHeight + (gPreferedHeight - gStartHeight) * progress;
		
			//フェード処理
			if(gWindowFade == FADE_IN){
				gWindowAlpha += 100 * interval / PARAMS.WindowInterval;
				if(gWindowAlpha > 100){
					gWindowAlpha = 100;
					gWindowFade = FADE_STOP;
				}
				
				set_alpha(gHoverWindow, gWindowAlpha);
			}else if(gWindowFade == FADE_OUT){
				gWindowAlpha -= 100 * interval / PARAMS.WindowInterval;
				if(gWindowAlpha < 1){
					gWindowAlpha = 1;
					
					gNextImage = null;
					set_hover_window_invisible();
					
					gWindowFade = FADE_STOP;
					gHoverImages = new Array();
					return;
				}else{
					set_alpha(gHoverWindow, gWindowAlpha);
				}
			}
		
			var minNoTransparentIndex = null;
			var renewArray = false;
			var fadeProgressing = false;
			var showBackground = true;
	
			for(var i = 0;i < gHoverImages.length; i ++){
				var hoverImage = gHoverImages[i];
				var element = hoverImage[HI_ELEMENT];
				if(minNoTransparentIndex == null){
					if(hoverImage[HI_LOADED]){
						var alpha = hoverImage[HI_ALPHA];
						if(hoverImage[HI_FADE] == FADE_IN){
							alpha += 100 * interval / hoverImage[HI_INTERVAL];
							if(alpha > 100){
								set_inner_alpha(element,100);
								minNoTransparentIndex = i;
								hoverImage[HI_ALPHA] = 100;
								hoverImage[HI_FADE] = FADE_STOP;
								showBackground = false;
							}else{
								set_inner_alpha(element,alpha);
								hoverImage[HI_ALPHA] = alpha;
								fadeProgressing = true;
							}
						}else if(hoverImage[HI_FADE] == FADE_OUT){
							alpha -= 100 * interval / hoverImage[HI_INTERVAL];
							if(alpha <= 1){
								hoverImage[HI_ELEMENT] = null;
								document.body.removeChild(element);
								renewArray = true;
							}else{
								set_inner_alpha(element,alpha);
								hoverImage[HI_ALPHA] = alpha;
								fadeProgressing = true;
							}
						}else{
							set_inner_alpha(element,alpha);
							if(alpha >= 100){
								showBackground = false;
							}
						}
					}else{
						fadeProgressing = true;
					}
				}else{
					hoverImage[HI_ELEMENT] = null;
					document.body.removeChild(element);
					renewArray = true;
				}
			}

			if(showBackground){
				gNowLoadingCounter += interval;
				var nowLoadingColorRatio = Math.sin(gNowLoadingCounter * NOW_LOADING_COUNT_RATIO) / 2.0 + 0.5;
				var backgroundColor = make_color(
					PARAMS.NowLoadingRMin + (PARAMS.NowLoadingRMax - PARAMS.NowLoadingRMin) * nowLoadingColorRatio,
					PARAMS.NowLoadingGMin + (PARAMS.NowLoadingGMax - PARAMS.NowLoadingGMin) * nowLoadingColorRatio,
					PARAMS.NowLoadingBMin + (PARAMS.NowLoadingBMax - PARAMS.NowLoadingBMin) * nowLoadingColorRatio);
		//		debug_output(backgroundColor);
				gHoverBackground.style.color = backgroundColor;
			}else{
				gHoverBackground.style.color = PARAMS.HoverWindowBackgroundColor;
			}
			
			
			if(renewArray){
				renew_hover_image_array();
			}
			set_position(gCurrentLeft,gCurrentTop,gCurrentWidth,gCurrentHeight);
			if(gCurrentLeft == gPreferedLeft && gCurrentTop == gPreferedTop && gCurrentWidth == gPreferedWidth && gCurrentHeight == gPreferedHeight &&
			   gMoveProgress == PARAMS.MoveInterval && gWindowFade == FADE_STOP && !fadeProgressing){
				return;
			}
		
		}
		set_timer();
	}
	
	function is_IE(){
		return gUserAgent == UA_IE6 || gUserAgent == UA_IE7 || gUserAgent == UA_IE8;
	}
	
	function set_alpha(target,alpha){
		if(gUserAgent == UA_IE6 || gUserAgent == UA_IE7){
			target.style["filter"] = "alpha(style=0,opacity=" + alpha + ");";
		}else if(gUserAgent == UA_IE8){
			target.style["filter"] = "alpha(style=0,opacity=" + alpha + ");";
		}else if(gUserAgent == UA_FIREFOX || gUserAgent == UA_GECKO){
			target.style.MozOpacity = alpha / 100.0;
		}else if(gUserAgent == UA_KONQUEROR){
			target.style.KHTMLOpacity = alpha / 100.0;
		}else{
			target.style.opacity = alpha / 100.0;
		}
	}
	
	//var testmargin = 1;
	
	function set_image_position(image, data){
		var image_width = data[IMAGE_WIDTH]
		var image_height = data[IMAGE_HEIGHT];
		var mp_total = data[IMAGE_MP_TOTAL];
		var mp_index = data[IMAGE_MP_INDEX];
		var left   = gHoverWindow.offsetLeft   + gHoverBackground.offsetLeft - gHoverBackground.offsetWidth * mp_index;
		var top    = gHoverWindow.offsetTop    + gHoverBackground.offsetTop;
		var width  = gHoverBackground.offsetWidth * mp_total;
		var height = gHoverBackground.offsetHeight;
		var clip_width = gHoverBackground.offsetWidth;
		
		if(gUserAgent != UA_IE8){
			left += PARAMS.HoverWindowBorderWidth;
			top += PARAMS.HoverWindowBorderWidth;
		}else{
			clip_width -= 1;
		}

		image.style.left   = to_px_m(left);
		image.style.top    = to_px_m(top);
		image.style.width  = to_px(width);
		image.style.height = to_px(height);
		if(mp_total != null && mp_total > 1){
			image.style.clip = "rect(0px " + to_px(gHoverBackground.offsetWidth * mp_index + clip_width) + " " + to_px(image_height) + " " + to_px(gHoverBackground.offsetWidth * mp_index) + ")";
		}
	}
	
	function set_position(left, top, width, height){
		gHoverWindow.style.left = to_px(left);
		gHoverWindow.style.top  = to_px(top);
	
		var paddingTop = Math.round(height / 2);
		gHoverBackground.style.paddingTop = to_px(paddingTop);
		gHoverBackground.style.height = to_px(height - get_hover_window_border_height() - paddingTop);
		gHoverBackground.style.width  = to_px(width - get_hover_window_border_width());
	
		for(var i = 0; i < gHoverImages.length; i ++){
			var hoverImage = gHoverImages[i];
			set_image_position(hoverImage[HI_ELEMENT], hoverImage[HI_DATA]);
		}
	}
	
	mouse_over = function(event, filename, width, height, mp_total, mp_index){
		if(gUserAgent == UA_NOT_SUPPORTED){
			return;
		}
		parse_event(event);
		if(gEvent.shiftKey || gEvent.ctrlKey){
			return;
		}
		if(mp_total == 0){
			mp_total = 1;
		}
		gAnimeTarget = gSrcElement;
		set_mouse_events(gSrcElement, mouse_move, mouse_out);
		
		while(gAnimeTarget != null && gAnimeTarget.onmouseover == null){
			gAnimeTarget = gAnimeTarget.parentNode;
		}
		
		var data = new Array();
		data[IMAGE_URL]      = PARAMS.ImageSrc + filename;
		data[IMAGE_WIDTH]    = width;
		data[IMAGE_HEIGHT]   = height;
		data[IMAGE_MP_TOTAL] = mp_total;
		data[IMAGE_MP_INDEX] = mp_index;
		data[IMAGE_CAPTION]  = expand_node_values(gSrcElement);
		data[IMAGE_SRC_ELEMENT] = gSrcElement;
		disp_image(data);
	}
	
	function mouse_move(event){
		parse_event(event);
		if(gEvent.shiftKey || gEvent.ctrlKey){
			return;
		}
		if(gHoverImages.length > 0){
			var imageData = gHoverImages[0];
			set_image_prefered_pos(imageData[HI_DATA][IMAGE_WIDTH],imageData[HI_DATA][IMAGE_HEIGHT]);
			table_move_start();
			start_timer();
		}
	}
	
	function mouse_out(event){
		gWindowFade = FADE_OUT;
		
		gAnimeTarget = null;
		
		start_timer();
	}
	
	function hover_mouse_out(event){
		mouse_out(event);
	}
	
	function hover_mouse_move(event){
		if(gHoverImages.length > 0){
			parse_event(event);
			var imageData = gHoverImages[0];
			set_image_prefered_pos(imageData[HI_DATA][IMAGE_WIDTH],imageData[HI_DATA][IMAGE_HEIGHT]);
			table_move_start();
			gWindowFade = FADE_IN;
			start_timer();
		}
	}
	
	function expand_node_values(node){
		if(node.nodeName == "IMG"){
			return node.alt;
		}
		if(node.nodeName == "A" && node.title != null && node.title != ""){
			return node.title;
		}
		var value = "";
		for(var i = 0;i < node.childNodes.length;i ++){
			if(node.childNodes[i].nodeValue != null){
				value += node.childNodes[i].nodeValue;
			}
			value += expand_node_values(node.childNodes[i]);
		}
		return value;
	}
	
	function table_move_start(){
		gStartLeft   = gCurrentLeft;
		gStartTop    = gCurrentTop;
		gStartWidth  = gCurrentWidth;
		gStartHeight = gCurrentHeight;
		
		gMoveProgress = 0;
	}
	
	function hover_image_loaded(event){
		parse_event(event);
		var element = gSrcElement;
		if(gUserAgent == UA_FIREFOX || gUserAgent == UA_GECKO){
			element = this;
		}
		var elementFound = false;
		var renewArray = false;
	
		for(var i = 0; i < gHoverImages.length; i ++){
			var hoverImage = gHoverImages[i];
			if(elementFound){
				if(hoverImage[HI_ALPHA] == 1 || hoverImage[HI_LOADED] == false){
					document.body.removeChild(hoverImage[HI_ELEMENT]);
					hoverImage[HI_ELEMENT] = null;
					renewArray = true;
				}else if(hoverImage[HI_FADE] == FADE_OUT){
					hoverImage[HI_FADE] = FADE_STOP;
				}
			}else{
				if(hoverImage[HI_ELEMENT] == element){
					elementFound = true;
					hoverImage[HI_LOADED] = true;
					
					hoverImage[HI_INTERVAL] = PARAMS.PictureInterval;
				}
			}
		}
		if(renewArray){
			renew_hover_image_array();
		}
	}
	
	function new_hover_image(data){
		for(var i = 0; i < gHoverImages.length; i ++){
			var hoverImage = gHoverImages[i];
			hoverImage[HI_FADE] = FADE_OUT;
			hoverImage[HI_INTERVAL] = PARAMS.PictureInterval;
		}
	
		var imageData = new Array();
		var image;
		image = document.createElement("img");
	
		image.style.position = "absolute";
		image.style.top = "0px";
		image.style.left = "0px";
		image.style.margin = "0px";
		image.style.padding = "0px";
		image.style.borderWidth = "0px";
		
		document.body.appendChild(image);
		set_alpha(image,1);
		set_image_position(image, data);
	
		imageData[HI_ELEMENT]  = image;
		imageData[HI_ALPHA]    = 1;
		imageData[HI_LOADED]   = false;
		imageData[HI_INTERVAL] = 1;
		imageData[HI_FADE]     = FADE_IN;
		imageData[HI_DATA]     = data;
	
		gHoverImages.unshift(imageData);
	
		if(is_IE()){
			image.onload = hover_image_loaded;
		}else{
			image.addEventListener("load",hover_image_loaded,false);
		}
		set_mouse_events(image, hover_mouse_move, hover_mouse_out);
		
		image.src = data[IMAGE_URL];
		return imageData;
	}
	
	function set_mouse_events(element, mousemove, mouseout){
		if(is_IE()){
			element.onmousemove = mousemove;
			element.onmouseout = mouseout;
		}else{
			element.addEventListener("mousemove",mousemove,false);
			element.addEventListener("mouseout",mouseout,false);
		}
	}
	
	function set_hover_window_visible(){
		if(gHoverWindow == null){
			var hoverWindow = document.createElement("div");
			var caption = document.createElement("div");
			var background = document.createElement("div");
		
			hoverWindow.style.position = "absolute";
			hoverWindow.style.borderStyle = "solid";
			hoverWindow.style.borderColor = PARAMS.HoverWindowBorderColor;
			hoverWindow.style.backgroundColor = PARAMS.HoverWindowBackgroundColor;
			hoverWindow.style.borderWidth = "" + PARAMS.HoverWindowBorderWidth + "px";
			hoverWindow.style.padding = "0px";
			
			set_mouse_events(hoverWindow, hover_mouse_move, hover_mouse_out);
			
			caption.style.borderStyle = "solid";
			caption.style.borderColor = PARAMS.HoverWindowBorderColor;
			caption.style.borderWidth = "0px 0px " + PARAMS.HoverWindowBorderWidth + "px 0px";
			caption.style.padding = "0px";
			caption.style.backgroundColor = PARAMS.HoverCaptionBackgroundColor;
			caption.style.textAlign = "center";
		
			background.style.margin = "0px";
			background.style.borderWidth = "0px";
			background.style.padding = "0px";
			background.style.backgroundColor = PARAMS.HoverBackgroundBackgroundColor;
			background.style.textAlign = "center";
			background.style.fontSize = "large";
			background.style.fontWeight = "bolder";
		
			document.body.appendChild(hoverWindow);
			hoverWindow.appendChild(caption);
			hoverWindow.appendChild(background);
			background.appendChild(document.createTextNode("Now loading..."));
			caption.appendChild(document.createTextNode("無題"));
			
			gHoverWindow = hoverWindow;
			gHoverCaption = caption;
			gHoverBackground = background;
			gWindowAlpha = 1;
			
			set_alpha(gHoverWindow,gWindowAlpha);
			set_alpha(caption,100);
			set_alpha(background,100);
		}
	}
	
	function set_hover_window_invisible(){
		if(gHoverWindow != null){
			document.body.removeChild(gHoverWindow);
			gHoverWindow = null;
			gHoverCaption = null;
			gHoverBackground = null;
			for(var i = 0; i < gHoverImages.length; i ++){
				var hoverImage = gHoverImages[i];
				document.body.removeChild(hoverImage[HI_ELEMENT]);
			}
			gHoverImages = new Array();
		}
	}
	
	function disp_image(data){
		set_hover_window_visible();
		var caption;
		if(data[IMAGE_CAPTION] == ""){
			caption = "noname";
		}else{
			caption = data[IMAGE_CAPTION];
		}
		if(data[IMAGE_MP_TOTAL] >= 2){
			caption += " " + (data[IMAGE_MP_INDEX] + 1) + "/" + data[IMAGE_MP_TOTAL];
		}
		gHoverCaption.firstChild.nodeValue = caption;
	
		set_image_prefered_pos(data[IMAGE_WIDTH], data[IMAGE_HEIGHT]);

		if(gWindowAlpha <= 1){
			gCurrentLeft   = gPreferedLeft + 10;
			gCurrentTop    = gPreferedTop + 10;
			gCurrentWidth  = gPreferedWidth - 20;
			gCurrentHeight = gPreferedHeight - 20;
			
			new_hover_image(data);
			
			gWindowAlpha = 1;
			
			gWindowFade = FADE_IN;
	
			set_alpha(gHoverWindow,gWindowAlpha);
	
		}else if(gHoverImages.length > 0){
			if(gHoverImages[0][HI_DATA][IMAGE_URL] == data[IMAGE_URL] && gHoverImages[0][HI_DATA][IMAGE_MP_INDEX] == data[IMAGE_MP_INDEX]){
				gWindowFade = FADE_IN;
			}else{
				new_hover_image(data);
				gWindowFade = FADE_IN;
			}
		}
		
		table_move_start();
		start_timer();
	
	}
	
	function set_image_prefered_pos(width,height){
		if(gHoverWindow == null){
			return;
		}

		var disp_width  = width;
		var disp_height = height;
		var max_width;
		var max_height;
		
		var disp_right = gMouseX < get_client_width() / 2;
		var disp_bottom = gMouseY < get_client_height() / 2;
	
		if(disp_right){
			max_width = get_client_width() - gMouseX - get_hover_window_border_width() - PARAMS.MouseMargin;
		}else{
			max_width = gMouseX - get_hover_window_border_width() - PARAMS.MouseMargin;
		}
		if(disp_bottom){
			max_height = get_client_height() - gMouseY - get_hover_window_border_height() - PARAMS.MouseMargin;
		}else{
			max_height = gMouseY - get_hover_window_border_height() - PARAMS.MouseMargin;
		}
	
		if(disp_width * max_height < disp_height * max_width){
			max_height = disp_height * max_width / disp_width;
		}else{
			max_width = disp_width * max_height / disp_height;
		}
		
		if(max_width > get_client_width() * PARAMS.MaxSizeRatio){
			max_width = get_client_width() * PARAMS.MaxSizeRatio;
		}
		if(max_height > get_client_height() * PARAMS.MaxSizeRatio){
			max_height = get_client_height() * PARAMS.MaxSizeRatio;
		}
		
		var width1,width2,height1,height2;
		
		if(width > max_width){
			width1  = max_width;
			height1 = max_width * disp_height / disp_width;
		}else{
			width1  = width;
			height1 = width * disp_height / disp_width;
		}
	
		if(height > max_height){
			width2  = max_height * disp_width / disp_height;
			height2 = max_height;
		}else{
			width2  = height * disp_width / disp_height;
			height2 = height;
		}
		
		var table_left,table_top,table_width,table_height;
		
		if(width1 < width2){
			table_width  = Math.round(width1) + get_hover_window_border_width();
			table_height = Math.round(height1) + get_hover_window_border_height();
		}else{
			table_width  = Math.round(width2) + get_hover_window_border_width();
			table_height = Math.round(height2) + get_hover_window_border_height();
		}
		if(disp_right){
			table_left = get_scroll_left() + get_client_width() - table_width;
		}else{
			table_left = get_scroll_left();
		}
		if(disp_bottom){
			table_top  = get_scroll_top() + get_client_height() - table_height;
		}else{
			table_top  = get_scroll_top();
		}
		
		gPreferedLeft   = table_left;
		gPreferedTop    = table_top;
		gPreferedWidth  = table_width;
		gPreferedHeight = table_height;
	
	}
	
	function get_hover_window_border_width(){
		return PARAMS.HoverWindowBorderWidth * 2;
	}
	function get_hover_window_border_height(){
		return PARAMS.HoverWindowBorderWidth * 2 + gHoverCaption.offsetHeight;
	}
	function get_scroll_top(){
		if(gUserAgent == UA_OPERA){
			return document.body.scrollTop;
		}else if(gUserAgent == UA_FIREFOX || gUserAgent == UA_SAFARI || gUserAgent == UA_KONQUEROR || gUserAgent == UA_GECKO){
			return window.pageYOffset;
		}else{
			return document.documentElement.scrollTop;
		}
	}
	function get_scroll_left(){
		if(gUserAgent == UA_OPERA){
			return document.body.scrollLeft;
		}else if(gUserAgent == UA_FIREFOX || gUserAgent == UA_SAFARI || gUserAgent == UA_KONQUEROR || gUserAgent == UA_GECKO){
			return window.pageXOffset;
		}else{
			return document.documentElement.scrollLeft;
		}
	}
	function get_client_height(){
		if(gUserAgent == UA_OPERA){
			return document.body.clientHeight;
		}else if(gUserAgent == UA_FIREFOX || gUserAgent == UA_SAFARI || gUserAgent == UA_KONQUEROR || gUserAgent == UA_GECKO){
			return window.innerHeight;
		}else if(gUserAgent == UA_IE8 || gUserAgent == UA_IE6){
			return document.documentElement.clientHeight;
		}else{
			return document.documentElement.clientHeight;
		}
	}
	
	function get_client_width(){
		return document.getElementsByTagName("body")[0].offsetWidth;
	}
	function to_px(val){
		if(val > 0.1){
			return "" + Math.floor(val) + "px";
		}else{
			return "0px";
		}
	}
	function to_px_m(val){
		return "" + Math.floor(val) + "px";
	}
	
	
	//コマ送り関連
	var PRELOADING_ON_MOUSE_OVER_PARSER = new RegExp("mouse_over\\(event,\\s*('|\")(.*)('|\"),\\s*(\\d+),\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)\\);");
	
	
	function get_node_mouseover_info(node){
		if(node.onmouseover && ("" + node.onmouseover).match(PRELOADING_ON_MOUSE_OVER_PARSER)){
			var data = new Array();
			data[IMAGE_URL]         = PARAMS.ImageSrc + RegExp.$2;
			data[IMAGE_WIDTH]       = parseInt(RegExp.$4);
			data[IMAGE_HEIGHT]      = parseInt(RegExp.$5);
			data[IMAGE_CAPTION]     = expand_node_values(node);
			data[IMAGE_SRC_ELEMENT] = node;
			data[IMAGE_MP_TOTAL]    = parseInt(RegExp.$6);
			if(data[IMAGE_MP_TOTAL] == 0){
				data[IMAGE_MP_TOTAL] = 1;
			}
			data[IMAGE_MP_INDEX]    = parseInt(RegExp.$7);
			return data;
		}
		return null;
	}
	
	function get_last_mouseover(node){
		if(node == null){
			return null;
		}
		var ret = get_node_mouseover_info(node);
		if(ret){
			return ret;
		}
		for(var i = node.childNodes.length - 1; i >= 0; i --){
			var ret = get_last_mouseover(node.childNodes[i]);
			if(ret){
				return ret;
			}
		}
		return null;
	}
	
	function get_first_mouseover(node){
		if(node == null){
			return null;
		}
		var ret = get_node_mouseover_info(node);
		if(ret){
			return ret;
		}
		for(var i = 0; i < node.childNodes.length; i ++){
			var ret = get_first_mouseover(node.childNodes[i]);
			if(ret){
				return ret;
			}
		}
		return null;
	}
	
	function get_next_mouseover(node){
		if(node == null){
			return null;
		}
		var curNode = node.nextSibling;
		if(node.nodeName == "DIV" && (node.className == "left" || node.className == "right")){
			var className = node.className;
			while(curNode != null){
				if(curNode.nodeName == "DIV" && curNode.className == className){
					var ret = get_first_mouseover(curNode);
					if(ret != null){
						return ret;
					}
				}
				if(curNode.nodeName == "H4" || curNode.nodeName == "H5"){
					return null;
				}
				curNode = curNode.nextSibling;
			}
			return null;
		}
		var isParentBody = (node.parentNode != null && node.parentNode.nodeName == "BODY");
		while(curNode != null){
			if(isParentBody && !is_continued_node(curNode)){
				return null;
			}
			var ret = get_first_mouseover(curNode);
			if(ret){
				return ret;
			}
			curNode = curNode.nextSibling;
		}
		return get_next_mouseover(node.parentNode);
	}
	
	function get_index_of(siblings, node){
		for(var i = 0; i < siblings.length; i ++){
			if(siblings[i] == node){
				return i;
			}
		}
		return -1;
	}
	
	function is_continued_node(node){
		if(node.className == "follow" || node.className == "continue"){
			return true;
		}
		if(gUserAgent == UA_SAFARI || gUserAgent == UA_OPERA || gUserAgent == UA_FIREFOX){
			if(node.nodeName == "#text" && node.noveValue == null){
				return true;
			}
		}
		return false;
	}
	
	function get_prev_mouseover(node){
		if(node == null){
			return null;
		}
		var isParentBody = (node.parentNode != null && node.parentNode.nodeName == "BODY");
		var curNode = node;
		if(node.nodeName == "DIV" && (node.className == "left" || node.className == "right")){
			var className = node.className;
			curNode = node.previousSibling;
			while(curNode != null){
				if(curNode.nodeName == "DIV" && curNode.className == className){
					var ret = get_last_mouseover(curNode);
					if(ret != null){
						return ret;
					}
				}
				if(curNode.nodeName == "H4" || curNode.nodeName == "H5"){
					return null;
				}
				curNode = curNode.previousSibling;
			}
			return null;
		}
		while(true){
			if(isParentBody && !is_continued_node(curNode)){
				return null;
			}
			curNode = curNode.previousSibling;
			if(curNode == null){
				break;
			}
			var ret = get_last_mouseover(curNode);
			if(ret){
				return ret;
			}
		}
		return get_prev_mouseover(node.parentNode);
	}
	
	function wheel_rotate(event){
		parse_event(event);
		var direction = 1;
		if(gUserAgent == UA_FIREFOX){
			if (gEvent.detail < 0){
				direction = -1;
			}else if(gEvent.detail > 0){
				direction = 1;
			}
		}else{
			if (gEvent.wheelDelta < 0){
				direction = 1;
			}else if(gEvent.wheelDelta > 0){
				direction = -1;
			}
		}
		popup_animate(direction);
	}


	function key_down(event){
		parse_event(event);
		if(gEvent.keyCode == 37){
			popup_animate(-1);
		}else if(gEvent.keyCode == 39){
			popup_animate(1);
		}
	}

	function popup_animate(direction){
		if(gAnimeTarget == null){
			return;
		}
		if(gHoverWindow != null && gHoverImages.length > 0){
			var nextFrame = null;
			var caption = null;
			var curData = gHoverImages[0][HI_DATA];
			if(direction > 0){
				nextFrame = get_next_mouseover(gAnimeTarget);
				if(curData[IMAGE_MP_INDEX] < curData[IMAGE_MP_TOTAL] - 1 && (nextFrame == null || nextFrame[IMAGE_URL] != curData[IMAGE_URL] || nextFrame[IMAGE_MP_INDEX] != curData[IMAGE_MP_INDEX] + 1)){
					nextFrame = Array.apply(null, curData);
					nextFrame[IMAGE_MP_INDEX] ++;
				}
			}else{
				nextFrame = get_prev_mouseover(gAnimeTarget);
				if(curData[IMAGE_MP_INDEX] > 0 && (nextFrame == null || nextFrame[IMAGE_URL] != curData[IMAGE_URL] || nextFrame[IMAGE_MP_INDEX] != curData[IMAGE_MP_INDEX] - 1)){
					nextFrame = Array.apply(null, curData);
					nextFrame[IMAGE_MP_INDEX] --;
				}else if(nextFrame != null){
					if(nextFrame[IMAGE_MP_TOTAL] > 0 && nextFrame[IMAGE_MP_INDEX] != curData[IMAGE_MP_INDEX] - 1){
						nextFrame[IMAGE_MP_INDEX] = nextFrame[IMAGE_MP_TOTAL] - 1;
					}
				}
			}
			if(nextFrame != null){
				if(caption == null){
					caption = nextFrame[IMAGE_CAPTION];
				}
				disp_image(nextFrame);
				gAnimeTarget = nextFrame[IMAGE_SRC_ELEMENT];
			}
			if(gUserAgent == UA_FIREFOX){
				gEvent.preventDefault();
			}else{
				gEvent.returnValue = false;
			}
		}
	}
	
	var gParagraphs;
	var gParagraphIndex;
	var gParagraphCount;
	
	var ANIME_LIST_CREATE_COUNT = 100;
	var gAnimeTarget = null;

	var gDebgugWindow = null;
	
	function make_debug_window(){
		if(gDebgugWindow == null){
			var div = document.createElement("div");
			div.style.position = "absolute";
			div.style.borderStyle = "solid";
			div.style.borderColor = "black";
			div.style.borderWidth = "2px";
			div.style.padding = "0px";
			div.style.backgroundColor = "white";
			div.style.color = "black";
			div.style.fontSize = "small";
			div.style.fontFamily = "monospace";
			
			document.body.appendChild(div);
			
			gDebgugWindow = div;
		}
		gDebgugWindow.style.top = to_px(get_scroll_top());
	}
	
	function arguments_to_message(args){
		var message = "";
		if(args.length > 0){
			message = args[0];
			for(var i = 1; i < args.length; i ++){
				message += "," + args[i];
			}
		}
		return message;
	}
	
	function debug_output(){
		var message = arguments_to_message(arguments);
		make_debug_window();
		p_element = document.createElement("p");
		p_element.style.border = "0px";
		p_element.style.margin = "0px";
		p_element.style.padding = "0px";
		p_element.style.textIndent = "0px";
		if(gDebgugWindow.firstChild != null){
			gDebgugWindow.insertBefore(p_element,gDebgugWindow.firstChild);
		}else{
			gDebgugWindow.appendChild(p_element);
		}
		p_element.appendChild(document.createTextNode(message));
	}
	
	function info_output(){
		var message = arguments_to_message(arguments);
		p_element = document.createElement("p");
		p_element.style.border = "0px";
		p_element.style.margin = "0px";
		p_element.style.padding = "0px";
		p_element.style.textIndent = "0px";
		p_element.appendChild(document.createTextNode(message));
		document.body.appendChild(p_element);
	}
	

	function parse_event(event){
		if(!event){
			gEvent = window.event;
		}else{
			gEvent = event;
		}
		if(gUserAgent == UA_FIREFOX || gUserAgent == UA_SAFARI || gUserAgent == UA_KONQUEROR || gUserAgent == UA_GECKO){
			if(gUserAgent != UA_FIREFOX || (gEvent.type != "DOMMouseScroll" && gEvent.type != "keydown" && gEvent.type != "load")){
				gMouseX = gEvent.pageX - window.pageXOffset;
				gMouseY = gEvent.pageY - window.pageYOffset;
			}
			gSrcElement = gEvent.target;
		}else{
			gMouseX = gEvent.clientX;
			gMouseY = gEvent.clientY;
	
			gSrcElement = gEvent.srcElement;
		}
	}
	
	function set_user_agent(){
		var user_agent = navigator.userAgent;
		if(user_agent.match(USER_AGENT_PARSER_IE)){
			if(document.documentMode){
				if(document.documentMode == 8){
					gUserAgent = UA_IE8;
				}else{
					gUserAgent = UA_IE7;
				}
			}else if(RegExp.$1 == "8"){
				gUserAgent = UA_IE8;
			}else if(RegExp.$1 == "7"){
				gUserAgent = UA_IE7;
			}else{
				gUserAgent = UA_IE6;
			}
		}else if(user_agent.match(USER_AGENT_PARSER_SAFARI)){
			gUserAgent = UA_SAFARI;
		}else if(user_agent.match(USER_AGENT_PARSER_FIREFOX)){
			gUserAgent = UA_FIREFOX;
		}else if(user_agent.match(USER_AGENT_PARSER_KONQUEROR)){
			gUserAgent = UA_KONQUEROR;
		}else if(user_agent.match(USER_AGENT_PARSER_GECKO)){
			gUserAgent = UA_GECKO;
		}else if(user_agent.match(USER_AGENT_PARSER_OPERA)){
			gUserAgent = UA_OPERA;
		}else{
			gUserAgent = UA_NOT_SUPPORTED;
			return false;
		}
	}
	
	onmousewheel_initialize = function(){
		if(is_IE() || gUserAgent == UA_OPERA || gUserAgent == UA_SAFARI || gUserAgent == UA_GECKO){
			document.body.onmousewheel = wheel_rotate;
			document.onkeydown = key_down;
		}else{
			document.body.addEventListener("DOMMouseScroll",wheel_rotate,true);
			document.onkeydown = key_down;
		}
		return;
	}
	set_user_agent();
}
