﻿var BookReader={
	Version:'1.0.0', 
	Released:'20090303', 
	FontSize:'S',
	Path:'',
	PageWidth:0,
	PageHeight:0,
	PageMargins:[],
	LineWidth:0,
	LineHeight:0,
	thisheight:0,
	heightleft:0,
	NowLoading:false, 
	lang:null,
	Language:null,
	CookieManager:null, 
	AutoLoading:true, 
	original:null, 
	searchBox:null,
	searchflag: false,
	searchWord:'',
	toolbar:null,
	toolbarOp:false,
	toolbarSize:[],
	opTimeout:null,
	timeout:null,
	stock:new Array(),
	dom:null, 
	pages:[''], 
	anchors:[], 
	currentline:0, 
	currentpage:0, 
	ImageStack:[], 
	AnchorStack:[], 
	isFocus: false,
	start:0,
	loadTheme:function(){
		var s1 = document.getElementsByTagName("script");
		var s;
		
		for (var i = 0; i < s1.length; i++) {
			s = s1[i];
			if (s.src && s.src.match(/bookreader\.js(\?.*)?$/)) break;
		}
		
		$('div id="br_contants"').css("display", "none");
		
		// ブラウザの言語を調べる。
		BookReader.lang=BookReader.browserLanguage();
		if(BookReader.lang.toLowerCase().indexOf('ja') > -1){
			BookReader.lang = 'ja';
		}else{
			BookReader.lang = 'en';
		}
		
		
		// OSを調べる
		BookReader.Path=s.src.replace(/bookreader\.js(\?.*)?$/,'');
		if(navigator.userAgent.indexOf('Mac OS X') > -1) os='mac';
		if(navigator.userAgent.indexOf('Windows NT 6') > -1) os='vista';
		
		// ナビ用の説明読み込み
		document.write('<sc'+'ript type="text/javascript" src="'+BookReader.Path+'languages.js"></script>');
		
		// デザイン用jsの読み込み。
		document.write('<sc'+'ript type="text/javascript" src="'+BookReader.Path+'default.js"></script>');
		
	},
	autoload:function(){
		if(BookReader.AutoLoading) BookReader.load();
		if(anc=location.hash) BookReader.go2anchor(anc);
		BookReader.resize;
	},
	load:function(){
		// 多言語対応。言語の指定が無ければデフォルトを。あればブラウザ情報と同一の言語を選択する。
		BookReader.selectShowingLanguage();
		
		// 中身となるbr_bodyを挿入。
		BookReader.dom = $("<div id=\"br_body\">");
		BookReader.dom.insertAfter(BookReader.original.get(0));
				
		// ページナビを作成。
		$('<div id="pagerBalloon"></div>').insertAfter($("div#footer_for_print"));
		$("#pagerBalloon").hide();
		
		// ツールバーを作成。
		BookReader.toolbar = $('<div id="br_toolbar"></div>');
		BookReader.toolbar.insertAfter($("div#footer_for_print"));
		$('<div id="br_toolbar_group1"></div>').appendTo('div#br_toolbar');
		$('<div id="br_toolbar_group2"></div>').appendTo('div#br_toolbar');
		$('<a id="br_toolbar_home" onmouseover="BookReader.tooltip1text(BookReader.Language.ButtonTitleGoToHome)" onmouseout="BookReader.tooltip1text(BookReader.Language.ButtonTitleGroup1)" onclick="BookReader.go2first()"></a>').appendTo('div#br_toolbar_group1');
		$('<a id="br_toolbar_prev" onmouseover="BookReader.tooltip1text(BookReader.Language.ButtonTitleGoToPrev)" onmouseout="BookReader.tooltip1text(BookReader.Language.ButtonTitleGroup1)" onclick="BookReader.go2prev()"></a>').appendTo('div#br_toolbar_group1');
		$('<a id="br_toolbar_next" onmouseover="BookReader.tooltip1text(BookReader.Language.ButtonTitleGoToNext)" onmouseout="BookReader.tooltip1text(BookReader.Language.ButtonTitleGroup1)" onclick="BookReader.go2next()"></a>').appendTo('div#br_toolbar_group1');
		$('<a id="br_toolbar_end" onmouseover="BookReader.tooltip1text(BookReader.Language.ButtonTitleGoToEnd)" onmouseout="BookReader.tooltip1text(BookReader.Language.ButtonTitleGroup1)" onclick="BookReader.go2last()"></a>').appendTo('div#br_toolbar_group1');
		$('<div id="br_toolbar_tooltip1">ショートカットキー</div>').appendTo('div#br_toolbar_group1');
		$('<a id="br_toolbar_rss" onmouseover="BookReader.tooltip2text(BookReader.Language.ButtonTitleRSS)" onmouseout="BookReader.tooltip2text(BookReader.Language.ButtonTitleGroup2)" onclick=""></a>').appendTo('div#br_toolbar_group2');
		$('<a id="br_toolbar_print" onmouseover="BookReader.tooltip2text(BookReader.Language.ButtonTitlePrint)" onmouseout="BookReader.tooltip2text(BookReader.Language.ButtonTitleGroup2)" onclick="window.print();return false;"></a>').appendTo('div#br_toolbar_group2');
		$('<div id="br_toolbar_tooltip2">ツールバー</div>').appendTo('div#br_toolbar_group2');
		
		
		// 検索ボックスを作成。
		$('<div id="searchBox"></div>').appendTo("div#br_toolbar");
		$('<form id="searchForm"><input type="text" id="searchBoxText" name="searchBoxText" onkeyup="BookReader.searching(this.value)" onfocus="BookReader.isFocus = true" onblur="BookReader.isFocus = false;"></input></form>').appendTo("div#searchBox");
		$('<a id="searchprev" onmouseover="BookReader.tooltip3text(BookReader.Language.ButtonTitleSearchPrev)" onmouseout="BookReader.tooltip3text(BookReader.Language.ButtonTitleSearch)" onclick="BookReader.search(false)"></a>').appendTo("div#searchBox");
		$('<a id="searchnext" onmouseover="BookReader.tooltip3text(BookReader.Language.ButtonTitleSearchNext)" onmouseout="BookReader.tooltip3text(BookReader.Language.ButtonTitleSearch)" onclick="BookReader.search(true)"></a>').appendTo("div#searchBox");
		$('<div id="br_toolbar_tooltip3">ページ内検索</div>').appendTo('div#br_toolbar');
		
		if (window.addEventListener) window.addEventListener('DOMMouseMove', BookReader.dispPos, false);
		window.onmousemove = document.onmousemove = BookReader.dispPos;
		BookReader.opTimeout = setTimeout("BookReader.toolbarOp = true", 2999);
		BookReader.timeout = setTimeout("BookReader.brToolbarOut()", 3000);
		setTimeout("BookReader.readToolbarSize();", 100);
		BookReader.attachBlockEnter('searchForm');
		
		// width, heightを取得するために一時的にtempPageを差し込む。
		var tempPage = $("<div class=\"page\"><div class=\"box\"></div></div>");
		tempPage.appendTo(BookReader.dom);
		BookReader.PageWidth = $("#br_body div.page").css("width");
		BookReader.PageHeight = $("#br_body div.page").css("height");
		BookReader.PageMargins[0] = $("#br_body div.box").css("margin-top");
		BookReader.PageMargins[1] = $("#br_body div.box").css("margin-right");
		BookReader.PageMargins[2] = $("#br_body div.box").css("margin-bottom");
		BookReader.PageMargins[3] = $("#br_body div.box").css("margin-left");
		BookReader.LineWidth = BookReader.PageWidth - (BookReader.PageMargins[1] + BookReader.PageMargins[3]);
		BookReader.LineHeight = BookReader.PageHeight - (BookReader.PageMargins[0] + BookReader.PageMargins[2]);
		// tempPageの削除
		tempPage.remove();
		//--
		
		BookReader.loadCookie();
		BookReader.updatePages();
		BookReader.setKeyEvent();
		var colorful = new BookReader.colorfulInput();
		colorful.skip = ['submit'];
		colorful.color['focus'] = '#ffffcc';
   		colorful.set();
		
		// Ctrl+Fのバインド。
		if (navigator.userAgent.indexOf("MSIE") != -1) { // For IE
			shortcut.add("Ctrl+F",function(e) {
				if(!BookReader.toolbarOp){
					BookReader.brToolbarOver();
					$("input#searchBoxText").focus();
				}else{
					$("input#searchBoxText").blur();
					BookReader.brToolbarOut();
				}
				e.cancelBubble = true;
				e.returnValue = false;
				e.keyCode = 0;
				return false;
			},{
				'type':'keydown',
				'propagate':false,
				'target':document,
			});
			
			shortcut.add("Ctrl+G",function(e) {
				if(!BookReader.toolbarOp){
					BookReader.brToolbarOver();
					$("input#searchBoxText").focus();
				}else{
					BookReader.search(false);
				}
				e.cancelBubble = true;
				e.returnValue = false;
				e.keyCode = 0;
				return false;
			},{
				'type':'keydown',
				'propagate':false,
				'target':document,
			});
		}else{
			jQuery(document).bind('keydown', 'Ctrl+f',
				function (evt){
					jQuery('#_Ctrl_f').addClass('dirty');
					
					if(!BookReader.toolbarOp){
						BookReader.brToolbarOver();
						$("input#searchBoxText").focus();
					}else{
						$("input#searchBoxText").blur();
						BookReader.brToolbarOut();
					}
					evt.keyCode = 0;
					evt.returnValue = false;
					return false;
				});
			jQuery(document).bind('keydown', 'Ctrl+g',
				function (evt){
					jQuery('#_Ctrl_g').addClass('dirty');
					
					if(!BookReader.toolbarOp){
						BookReader.brToolbarOver();
						$("input#searchBoxText").focus();
					}else{
						$("input#searchBoxText").blur();
						BookReader.brToolbarOut();
					}
					evt.keyCode = 0;
					evt.returnValue = false;
					return false;
				});
		}
		
		// マウスのスクロール
		if (window.addEventListener) window.addEventListener('DOMMouseScroll', BookReader.wheel, false);
		window.onmousewheel = document.onmousewheel = BookReader.wheel;
	},
	resizeon: function(){
		if (window.addEventListener) window.addEventListener('DOMResize', BookReader.resize, false);
		window.onresize = document.onresize = document.body.onresize = BookReader.resize;
		window.onload = document.onload = document.body.onload = BookReader.resize;
	},
	resize: function(e){
		e = (e) ? e : ( (window.event) ? window.event : null );
		var pos = [];
		pos = BookReader.getMouseEventPos(e);	//この引数eは必須である。2007/07/07
		
		var h = $("div#header").attr('offsetHeight') + $("div#br_body").attr('offsetHeight') + $("div#footer").attr('offsetHeight') + $("div#br_toolbar").attr('offsetHeight');
		
		if(BookReader.timeout != null){
			clearTimeout(BookReader.timeout);
			BookReader.timeout = null;
		}
		if(BookReader.opTimeout != null){
			clearTimeout(BookReader.opTimeout);
			BookReader.opTimeout = null;
		}
		BookReader.toolbarOp = false;
		$("div#br_toolbar").show();
		BookReader.opTimeout = setTimeout("BookReader.toolbarOp = true;", 2999);
		BookReader.timeout = setTimeout("BookReader.brToolbarOut();", 3000);
		setTimeout("BookReader.readToolbarSize();", 100);
		
		if(pos[3] <= h){
			$("div#br_contents").css('top', $("div#header").attr('offsetHeight'));
			$("div#br_contents").css('margin-top', '0px');
		}else{
			$("div#br_contents").css('top', '50%');
			$("div#br_contents").css('margin-top', -(h/2 - $("div#header").attr('offsetHeight')) + 'px');
			var mr = $("div#br_contents").css('margin-top');
		}
	},
	readToolbarSize: function(){
		if( $("div#br_toolbar").offset().top == 0){
			setTimeout("BookReader.readToolbarSize()", 100);
			return;
		}
		BookReader.toolbarSize[0] = $("div#br_toolbar").offset().top;
		BookReader.toolbarSize[1] = $("div#br_toolbar").offset().left;
		BookReader.toolbarSize[2] = $("div#br_toolbar").attr('offsetWidth');
	},
	dispPos: function(e) {
		e = (e) ? e : ( (window.event) ? window.event : null );
		var pos = [];
		pos = BookReader.getMouseEventPos(e);	//この引数eは必須である。2007/07/07
		
//		var toolbartop = $("div#br_toolbar").offset().top;
//		var toolbarleft = $("div#br_toolbar").offset().left;
//		var toolbarwidth = $("div#br_toolbar").attr('offsetWidth');
		
//		BookReader.tooltip2text("mouse: " + pos[0] + ", " + pos[1]);
//		BookReader.tooltip1text("left: " + toolbarleft + ", right: " + (toolbarleft + toolbarwidth) + ", top: " + toolbartop);
		
		if(pos[0] >= BookReader.toolbarSize[1] && pos[0] <= BookReader.toolbarSize[1] + BookReader.toolbarSize[2] && pos[1] >= BookReader.toolbarSize[0]){
//			if(!BookReader.toolbarOp){
//				BookReader.brToolbarOver();
//			}
//		/*}else */if(pos[0] >= toolbarleft && pos[0] <= toolbarleft + toolbarwidth && pos[1] >= toolbartop){
			if(!BookReader.toolbarOp){
				BookReader.brToolbarOver();
			}
		}else{
			BookReader.brToolbarOut();
		}
		e.cancelBubble=true;
	},
	getMouseEventPos: function(e) {
		e = (e) ? e : ( (window.event) ? window.event : null );
		if (navigator.userAgent.indexOf("MSIE") != -1) {
			var values =
				[e.clientX, e.clientY, document.documentElement.clientWidth, document.documentElement.clientHeight
				];
		} else {
			var values =
				[e.clientX, e.clientY, window.innerWidth, window.innerHeight
				];
		}
    	return values;
	},
	tooltip1text: function(text){
		$("div#br_toolbar_tooltip1").html(text);
	},
	tooltip2text: function(text){
		$("div#br_toolbar_tooltip2").html(text);
	},
	tooltip3text: function(text){
		$("div#br_toolbar_tooltip3").html(text);
	},
	changeLanguage:function(lang){
		if(BookReader.original && BookReader.lang != lang){
			BookReader.lang = lang;
			BookReader.original = null;
			BookReader.selectShowingLanguage();
			BookReader.updatePages();
			
			// ツールバーの文字を更新
			BookReader.tooltip1text(BookReader.Language.ButtonTitleGroup1);
			BookReader.tooltip2text(BookReader.Language.ButtonTitleGroup2);
			BookReader.tooltip3text(BookReader.Language.ButtonTitleSearch);
		}
	},
	selectShowingLanguage:function(){
		var loadlang = "BookReader." + BookReader.lang;
		BookReader.Language = eval(loadlang);
		
		var bookreader=$("div.bookreader");
		$.each(bookreader, function(){
			var lang = $(this).attr("lang");
			if(!BookReader.original && (!lang || lang == BookReader.lang)){
				BookReader.original = $(this);
			}else{
				$(this).hide();
			}
		});
		
		// 一致する言語が見当たらなければ、一番初めのbookreaderクラスを表示。
		if(!BookReader.original) BookReader.original=$(bookreader[0]);
		BookReader.original.hide();
		
	},
	browserLanguage:function() {
		try {
			return (navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2)
		}
		catch(e) {
			return 'en';
		}
	},
	setLanguage:function(showingLanguage, languages) {
		var addCSSRule = (document.createStyleSheet) ? (function(sheet) {
			return function(selector, declaration) {
				sheet.addRule(selector, declaration);
			};
		})(document.createStyleSheet()) : (function(sheet){
			return function(selector, declaration) {
				sheet.insertRule(selector + '{' + declaration + '}', sheet.cssRules.length);
			};
		})((function(e){
			e.appendChild(document.createTextNode(''));
			(document.getElementsByTagName('head')[0] || (function(h) {
				document.documentElement.insertBefore(h, this.firstChild);
				return h;
			})(document.createElement('head'))).appendChild(e);
			return e.sheet;
		})(document.createElement('style')));
		
		var removeCSSRule = function(ruleName) {
			for(var i = 0; i < document.styleSheets.length; i++) { 
				var styleSheet = document.styleSheets[i];
				var ii = cssRule = 0;                              
				do {
					cssRule = (styleSheet.cssRules ? styleSheet.cssRules : styleSheet.rules)[ii];
					if(cssRule && cssRule.selectorText.toLowerCase() == ruleName) { 
						styleSheet.cssRules ? styleSheet.deleteRule(ii) : styleSheet.removeRule(ii);
						return true;
					}
				ii++;                                 
				} while(cssRule);
			}
			return false;
		};
		
		var array_include = function(ary, v) {
			for (var i in ary) {
				if (ary[i] == v) return true;
			}
			return false;
		};
		
		var array_addCSSRule = function(ary) {
			for (var i in ary) {
				addCSSRule("#br_body." + i, "display: none;");
			}
		};
		
//		var lang = BookReader.browserLanguage();
//		if(lang==default_language || !array_include(languages, lang)) return false;

		if(BookReader.lang == showingLanguage) return false;
		else BookReader.lang = showingLanguage;
		
		array_addCSSRule(languages);
//		addCSSRule("#br_body." + default_language, "display: none;");
		removeCSSRule("#br_body." + BookReader.lang);
		return true;
	},
	updatePages:function(){
		if(this.NowLoading) return;
		this.NowLoading=true;
		BookReader.makePages();
		BookReader.showPages();
		BookReader.go2first();
		this.NowLoading=false;
	}, 
	makePages:function(){
		BookReader.pages=[''];
		BookReader.anchors=[];
		var hi = $("div#br_body").css("height");
		if(hi.match("px", "i")){
			hi = hi.substring(0, hi.length - 2);
		}
		BookReader.thisheight=eval(hi);
		BookReader.heightleft=eval(hi) - 105; // TODO CSSに対応したい。
		BookReader.currentpage=0;
		$.each(BookReader.original.children(), function(){
			var tag=this.tagName;
			var fontsize=BookReader.FontSize;
			var thiswidth = BookReader.Theme.LineWidth;
//			var maxline=BookReader.Theme[fontsize].MaxLine;
//			var maxletter=BookReader.Theme[fontsize].MaxLetter;
//			var maxletterH2=BookReader.Theme[fontsize].MaxLetterH2;
			var fsize = $(this).css("font-size");
			if(fsize.match("px", "i")){
				fsize = fsize.substring(0, fsize.length - 2);
			}
			var maxletter = thiswidth / eval(fsize);
			
			var hline = $(this).css("line-height");
			if(hline.match("px", "i")){
				hline = hline.substring(0, hline.length - 2);
			}
			var lineheight;
			if(hline.match("normal", "i")){
				lineheight = eval(fsize);
				lineheight *= 1.5;
			}else{
				lineheight = eval(hline);
				lineheight *= 1.5;
			}
			switch (tag){
			case 'DIV':
				s=$(this).html();
				w=$(this).attr('class');
				if(!w){
					w='';
				}
				
				t=BookReader.Utils.dividelines(s, maxletter);
				
				$.each(t, function(i, line){
					if(BookReader.heightleft <= lineheight){
						BookReader.insertPage();
					} 
					if(line != '<HR />'){
						if($(this).attr("align") == 'right'){
							BookReader.pages[BookReader.pages.length-1]+='<span class="'+fontsize+' '+w+' right">'+line+'</span>';
						} else if($(this).attr("align") == 'center'){
							BookReader.pages[BookReader.pages.length-1]+='<span class="'+fontsize+' '+w+' center">'+line+'</span>';
						} else {
							BookReader.pages[BookReader.pages.length-1]+='<span class="'+fontsize+' '+w+'">'+line+'</span>';
						} 
						BookReader.heightleft -= lineheight;
					}
				});
				break;
			case 'H1':
			case 'H2':
			case 'H3':
				t=BookReader.Utils.dividelines($(this).html(), maxletter);
				if(BookReader.heightleft <= lineheight * t.length){
					BookReader.insertPage();
				} 
				$.each(t, function(i, line){
					BookReader.pages[BookReader.pages.length-1]+='<'+tag+' class="'+fontsize+'">'+line+'</'+tag+'>';
					BookReader.heightleft -= lineheight;
				});
				break;
			case 'HR':
				if(BookReader.heightleft != (BookReader.thisheight - 105)) BookReader.insertPage();
				break;
			case 'IMG':
				w=$(this).attr('width');
				if(!w || w > BookReader.Theme.LineWidth) 
					w=BookReader.Theme.LineWidth;
				alt=$(this).attr('alt');
				temp='<IMG src="'+$(this).attr('src')+'" width="'+w+'" style="margin-top:10px;margin-bottom:10px;" />';
				if(alt) temp+='<P class="caption">'+$(this).attr('alt')+'</P>';
				if(BookReader.pages.length == 1 && BookReader.pages[0] == ''){
					BookReader.pages[0]+=temp;
					BookReader.insertPage();
				} else 
					BookReader.ImageStack.push(temp);
				BookReader.insertImage();
				break;
			}
		});
		BookReader.insertImage();
	}, 
	insertPage:function(){
		BookReader.insertAnchor();
		BookReader.insertImage();
		BookReader.pages.push('');
		BookReader.heightleft=BookReader.thisheight - 105;
	}, 
	insertAnchor:function(){
		if(BookReader.AnchorStack.length){
			$.each(BookReader.AnchorStack, function(anc){
				BookReader.anchors[anc]=BookReader.pages.length-1;
			});
			BookReader.AnchorStack=[];
		}
	}, 
	insertImage:function(){
		if(BookReader.ImageStack.length){
			$.each(BookReader.ImageStack, function(image){
				BookReader.pages.push(image);
			});
			BookReader.ImageStack=[];
		}
	}, 
	showPages:function(){
		var html='';
		var t=0.40;
		$.each(BookReader.pages, function(index, page){
			html+='<DIV class="page" style="width:' + (BookReader.Theme.PageWidth) + 'px;"><DIV class="box">'+page+'</DIV><SPAN class="folio" style="width:' + (BookReader.Theme.PageWidth + 1) + 'px;">'+(index+1)+'</SPAN></DIV>';
		});
//		html='<DIV style="width:'+ (BookReader.pages.length*(BookReader.Theme.PageWidth+1)+BookReader.Theme.PageMarginLeft) +'px" id="br_container">'+html+'</DIV>';
//		html+='<A class="br_nav_button" id="br_nav_prev2" href="#" title="'+BookReader.Language.ButtonTitleGoToPrev2.replace('#',BookReader.Theme.Columns)+'" onclick="BookReader.go2prev2();return false;" onmouseover="new Effect.Opacity (this,{from:'+t+', to:0.99, duration:0.2})" onmouseout="new Effect.Opacity (this,{from:0.99, to:'+t+', duration:1.0})">&nbsp;</A>';
//		html+='<A class="br_nav_button" id="br_nav_prev" href="#" title="'+BookReader.Language.ButtonTitleGoToPrev+'" onclick="BookReader.go2prev();return false;" onmouseover="new Effect.Opacity (this,{from:'+t+', to:0.99, duration:0.2})" onmouseout="new Effect.Opacity (this,{from:0.99, to:'+t+', duration:1.0})">&nbsp;</A>';
//		html+='<A class="br_nav_button" id="br_nav_next" href="#" title="'+BookReader.Language.ButtonTitleGoToNext+'" onclick="BookReader.go2next();return false;" onmouseover="new Effect.Opacity (this,{from:'+t+', to:0.99, duration:0.2})" onmouseout="new Effect.Opacity (this,{from:0.99, to:'+t+', duration:1.0})">&nbsp;</A>';
//		html+='<A class="br_nav_button" id="br_nav_next2" href="#" title="'+BookReader.Language.ButtonTitleGoToNext2.replace('#',BookReader.Theme.Columns)+'" onclick="BookReader.go2next2();return false;" onmouseover="new Effect.Opacity (this,{from:'+t+', to:0.99, duration:0.2})" onmouseout="new Effect.Opacity (this,{from:0.99, to:'+t+', duration:1.0})">&nbsp;</A>';
//		html+='<TABLE id="br_pagenation" cellspacing="0">';
		html='<DIV style="width:'+ (BookReader.pages.length*(BookReader.Theme.PageWidth)+BookReader.Theme.PageMarginLeft) +'px" id="br_container">'+html+'</DIV>';
		html+='<A class="br_nav_button" style="left:2px;" id="br_nav_prev2" href="#" title="'+BookReader.Language.ButtonTitleGoToPrev2.replace('#',BookReader.Theme.Columns)+'" onclick="BookReader.go2prev2();return false;" onmouseover="$(this).fadeTo(200, 0.99);" onmouseout="$(this).fadeTo(1000, '+t+');">&nbsp;</A>';
		html+='<A class="br_nav_button" style="left:' + (BookReader.Theme.PageMarginLeft + 2) + 'px;" id="br_nav_next" href="#" title="'+BookReader.Language.ButtonTitleGoToNext+'" onclick="BookReader.go2next();return false;" onmouseover="$(this).fadeTo(200, 0.99);" onmouseout="$(this).fadeTo(1000, '+t+');">&nbsp;</A>';
		html+='<A class="br_nav_button" style="left:' + (BookReader.Theme.PageWidth + 4) + 'px;" id="br_nav_prev" href="#" title="'+BookReader.Language.ButtonTitleGoToPrev+'" onclick="BookReader.go2prev();return false;" onmouseover="$(this).fadeTo(200, 0.99);" onmouseout="$(this).fadeTo(1000, '+t+');">&nbsp;</A>';
		html+='<A class="br_nav_button" style="left:' + (BookReader.Theme.PageWidth + BookReader.Theme.PageMarginLeft + 4) + 'px;" id="br_nav_next2" href="#" title="'+BookReader.Language.ButtonTitleGoToNext2.replace('#',BookReader.Theme.Columns)+'" onclick="BookReader.go2next2();return false;" onmouseover="$(this).fadeTo(200, 0.99);" onmouseout="$(this).fadeTo(1000, '+t+');">&nbsp;</A>';
		html+='<TABLE id="br_pagenation" cellspacing="0" width="' + (BookReader.Theme.PageWidth + 2) + 'px">';
		$.each(BookReader.pages, function(index, page){
			html+='<TD id="br_pagenation_'+index+'" onclick="BookReader.go2page('+index+');" onMouseOver="BookReader.popupBalloon('+index+')" onMouseOut="BookReader.removeBalloon('+index+')"></TD>';
		});
		html+='</TABLE>';
		html='<DIV id="br_fixedframe">'+html+'</DIV>';
		BookReader.dom[0].innerHTML = html;
//		setTimeout("new Effect.Opacity ('br_nav_prev2',{from:0.00, to:"+t+", duration:1.0});", 200);
//		setTimeout("new Effect.Opacity ('br_nav_prev',{from:0.00, to:"+t+", duration:1.0});", 200);
//		setTimeout("new Effect.Opacity ('br_nav_next2',{from:0.00, to:"+t+", duration:1.0});", 200);
		setTimeout("$(\"#br_nav_prev2\").fadeTo(1000, " +t+");", 200);
		setTimeout("$(\"#br_nav_prev\").fadeTo(1000, "+t+");", 200);
		setTimeout("$(\"#br_nav_next2\").fadeTo(1000, "+t+");", 200);
//		if(BookReader.pages.length <= 1){
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.00, to:"+t+", duration:1.0});", 200);
			setTimeout("$(\"#br_nav_next\").fadeTo(1000, "+t+");", 200);
//		} else {
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.00, to:0.99, duration:0.7});", 200);
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.99, to:0.00, duration:0.7});", 1000);
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.00, to:0.99, duration:0.7});", 1800);
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.99, to:0.00, duration:0.7});", 2600);
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.00, to:0.99, duration:0.7});", 3400);
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.99, to:0.00, duration:0.7});", 4200);
//			setTimeout("new Effect.Opacity ('br_nav_next',{from:0.00, to:"+t+", duration:0.7});", 5000);
//			setTimeout("$(\"#br_nav_next\").fadeTo(700, 0.99);", 200);
//			setTimeout("$(\"#br_nav_next\").fadeTo(700, 0.00);", 1000);
//			setTimeout("$(\"#br_nav_next\").fadeTo(700, 0.99);", 1800);
//			setTimeout("$(\"#br_nav_next\").fadeTo(700, 0.00);", 2600);
//			setTimeout("$(\"#br_nav_next\").fadeTo(700, 0.99);", 3400);
//			setTimeout("$(\"#br_nav_next\").fadeTo(700, 0.00);", 4200);
//			setTimeout("$(\"#br_nav_next\").fadeTo(700, "+t+");", 5000);
//		}
	}, 
	popupBalloon:function(page){
		var top = $("#br_pagenation_"+page+"").offset().top - 40;
		var left = $("#br_pagenation_"+page+"").offset().left;
		left += $("#br_pagenation_"+page+"").attr("offsetWidth")/2 - 20;
		$("#pagerBalloon").css("left", left+"px");
		$("#pagerBalloon").css("top", top+"px");
		$("#pagerBalloon").html(page+1);
		$("#pagerBalloon").show();
	},
	removeBalloon:function(page){
		$("#pagerBalloon").hide();
	},
	go2anchor:function(anc){
		if((anc=anc.replace('#','')) && BookReader.anchors[anc]){
			setTimeout("BookReader.go2page("+BookReader.anchors[anc]+")",500);
		}
	}, 
	go2prev2:function(){
		BookReader.go2page(BookReader.currentpage-BookReader.Theme.Columns);
	}, 
	go2prev:function(){
		BookReader.go2page(BookReader.currentpage - 1);
	}, 
	go2next:function(){
		BookReader.go2page(BookReader.currentpage+1);
	}, 
	go2next2:function(){
		BookReader.go2page(BookReader.currentpage+BookReader.Theme.Columns);
	}, 
	go2first:function(){
		BookReader.go2page(0);
	}, 
	go2last:function(){
		BookReader.go2page(BookReader.pages.length-1);
	}, 
	go2page:function(p){
		var time = 200;
		container=$('#br_container');
		if(container.queue().length > 1 && container.queue().length <= 4){
			container.dequeue();
//			time = 200 / container.queue().length + 2;
		}
		if(container.queue().length <= 4){
			BookReader.currentpage=p;
			if(BookReader.currentpage < 0){
				BookReader.currentpage=0;
//				new Effect.Move (container,{x:BookReader.Theme.PageMarginLeft+30, y:0, mode:'absolute', duration:0.2});
//				setTimeout("new Effect.Move (container,{x:BookReader.Theme.PageMarginLeft, y:0, mode:'absolute', duration:0.2})", 200);
				if(container.queue().length < 1){
					container.animate({top: "0px", left: BookReader.Theme.PageMarginLeft+30}, time);
					var tes = BookReader.Theme.PageMarginLeft;
					setTimeout("container.animate({top: \"0px\", left: "+tes+"}, " + time +")", time);
				}
			} else if(BookReader.currentpage > BookReader.pages.length-1){
				BookReader.currentpage=BookReader.pages.length-1;
//				new Effect.Move (container,{x:-(BookReader.currentpage*(BookReader.Theme.PageWidth+1)-BookReader.Theme.PageMarginLeft+30), y:0, mode:'absolute', duration:0.2});
//				setTimeout("new Effect.Move (container,{x:-(BookReader.currentpage*(BookReader.Theme.PageWidth+1)-BookReader.Theme.PageMarginLeft), y:0, mode:'absolute', duration:0.2})", 200);
				if(container.queue().length < 1){
					container.animate({top: "0px", left: -(BookReader.currentpage*(BookReader.Theme.PageWidth+1)-BookReader.Theme.PageMarginLeft+30)}, time);
					tes = -(BookReader.currentpage*(BookReader.Theme.PageWidth+1)-BookReader.Theme.PageMarginLeft);
					setTimeout("container.animate({top: \"0px\", left: "+tes+"}, " + time + ")", time);
				}
			} else {
//				new Effect.Move (container,{x:-(BookReader.currentpage*(BookReader.Theme.PageWidth+1)-BookReader.Theme.PageMarginLeft), y:0, mode:'absolute', duration:0.5});
				container.animate({top: "0px", left: -(BookReader.currentpage*(BookReader.Theme.PageWidth+1)-BookReader.Theme.PageMarginLeft)}, time * 2);
			} 
			$.each(BookReader.pages, function(p, page){
				$("#br_pagenation_"+p).css({backgroundColor:""});
			});
			if($("#br_pagenation_"+BookReader.currentpage)) 
				$("#br_pagenation_"+BookReader.currentpage).css({backgroundColor:"#999999"});
		}
	},
	setKeyEvent:function(){
		$(document).keydown(function(e){
			if(BookReader.isFocus) return true;
			var c=(e.charCode) ? e.charCode:e.keyCode;
			if(e.altKey || e.ctrlKey || e.shiftKey){
				return true;
			}
			switch (c){
			case 63232:
			case 63276:
			case 38:
				if(!BookReader.searchflag){
					BookReader.go2prev2();
					return false;
				}
				break;
			case 63233:
			case 63277:
			case 40:
				if(!BookReader.searchflag){
					BookReader.go2next2();
					return false;
				}
				break;
			case 63234:
			case 37:
				if(!BookReader.searchflag){
					BookReader.go2prev();
					return false;
				}
				break;
			case 63235:
			case 39:
				if(!BookReader.searchflag){
					BookReader.go2next();
					return false;
				}
				break;
			case 63273:
			case 36:
				if(!BookReader.searchflag){
					BookReader.go2first();
					return false;
				}
				break;
			case 63275:
			case 35:
				if(!BookReader.searchflag){
					BookReader.go2last();
					return false;
				}
				break;
			case 48:
				BookReader.go2page(10);
					break;
			case 49:
				alert(BookReader.toolbarSize + "::" + BookReader.toolbarOp);
			case 50:
			case 51:
			case 52:
			case 53:
			case 54:
			case 55:
			case 56:
			case 57:
				BookReader.go2page(c - 49);
					break;
			}
		});
	}, 
	wheel:function(event){
		var handle = function(delta){
			if (delta < 0)
				BookReader.go2next();
	        else
				BookReader.go2prev();
		};
		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)
			handle(delta);
		if (event.preventDefault) {
			event.preventDefault();
		}
		event.returnValue = false;
	},
	changeFontSize:function(size){
		size=(size == 'L' || size == 'M') ? size:'S';
		if(size == BookReader.Theme.FontSize) return;
		BookReader.FontSize=size;
		BookReader.updatePages();
		if(BookReader.CookieManager){
//			BookReader.CookieManager.setCookie('bookreader.fontsize', size);
			$.cookie('bookreader.fontsize', 'data');//書き込み{保存days}
		}
	}, 
	loadCookie:function(){
		if(typeof CookieManager=='undefined') return;
//		BookReader.CookieManager=new CookieManager();
//		var size=BookReader.CookieManager.getCookie('bookreader.fontsize');
		var size = $.cookie('bookreader.fontsize');//読み出し
		if(size == 'L' || size == 'M')
			BookReader.FontSize=size;
	}, 
	deactivate:function(){
//		BookReader.dom.style.display='none';
//		BookReader.original.style.display='block';
		BookReader.dom.css("display", "none");
		BookReader.original.css("display", "block");
	}, 
	activate:function(){
//		BookReader.dom.style.display='block';
//		BookReader.original.style.display='none';
		BookReader.dom.css("display", "block");
		BookReader.original.css("display", "none");
	},
	
	brToolbarOver: function(){
		if(BookReader.timeout != null){
			clearTimeout(BookReader.timeout);
			BookReader.timeout = null;
			if (navigator.userAgent.indexOf("MSIE") != -1) {
				$("div#br_toolbar").show();
			}else{
				$("div#br_toolbar").stop();
				$("div#br_toolbar").fadeTo("fast", 1.0);
			}
			BookReader.toolbarOp = true;
		}
		if(BookReader.opTimeout != null){
			clearTimeout(BookReader.opTimeout);
			BookReader.opTimeout = null;
			BookReader.toolbarOp = true;
		}
		
		if(!BookReader.toolbarOp){
			if (navigator.userAgent.indexOf("MSIE") != -1) {
				$("div#br_toolbar").fadeIn();
			}else{
				$("div#br_toolbar").stop();
				$("div#br_toolbar").fadeTo("fast", 1.0);
			}
			BookReader.toolbarOp = true;
		}
	},
	brToolbarOut: function(){
		if(BookReader.isFocus) return;
		if(BookReader.toolbarOp){
			if (navigator.userAgent.indexOf("MSIE") != -1) { // For IE
				$("div#br_toolbar").fadeOut();
			}else{
				$("div#br_toolbar").stop();
				$("div#br_toolbar").fadeTo("slow", 0.0);
			}
			BookReader.toolbarOp = false;
		}
	},
	// エンターキー防止処理
	attachBlockEnter: function(formid) {
		var elements = document.forms[formid].elements;
		for (var j=0; j < elements.length; j++) {
			var e = elements[j];	
			if (e.type == "text"){
				e.onkeypress = BookReader.blockEnter;
			}
		}
	},
	// エンターキー防止処理（サブ）
	blockEnter: function(evt){
		evt = (evt) ? evt : event; 
		var charCode=(evt.charCode) ? evt.charCode : 
			((evt.which) ? evt.which : evt.keyCode);
		if ( Number(charCode) == 13 || Number(charCode) == 3) {
			BookReader.search(true);
			return false;
		} else {
			return true;
		}
	},
	// 検索（エンター時）
	search:function(b) {
		var p = 10000;
		if(b){
			for(var i = 0; i < BookReader.pages.length;i++){
				var result = "";
				var result = BookReader.pages[i].toUpperCase().indexOf(BookReader.searchWord.toUpperCase());
				if(result >= 0){
					if(p == 10000 && BookReader.currentpage > i){
						p = i;
					}else if(BookReader.currentpage < i){
						p = i;
						break;
					}else if(BookReader.currentpage == i){
					}
				}
			}
		}else{
			for(var i = BookReader.pages.length - 1; i >= 0;i--){
				var result = "";
				var result = BookReader.pages[i].toUpperCase().indexOf(BookReader.searchWord.toUpperCase());
				if(result >= 0){
					if(p == 10000 && BookReader.currentpage < i){
						p = i;
					}else if(BookReader.currentpage > i){
						p = i;
						break;
					}else if(BookReader.currentpage == i){
					}
				}
			}
		}
		if(p != 10000){
			if(p != BookReader.currentpage){
				setTimeout("BookReader.go2page("+p+")",100);
			}
		}else{
			$("input#searchBoxText").css("background-color", "#ff7777");
		}
	},
	// リアルタイム検索関数
	searching:function(q) {
			for(var i=BookReader.stock.length-1;i>-1;i--){
				if(BookReader.stock[i][0].parentNode)
					BookReader.stock[i][0].parentNode.replaceChild(BookReader.stock[i][1],BookReader.stock[i][0]);
			}
			BookReader.stock.length=0;
			$('span.searchItem').remove();
			q = q.replace(/^\s+|\s+$/g,'');
			if(! q) return;
			BookReader.searchSub(document.body);
	},
	//検索関数(サブ)
	searchSub:function(oo) {
		var q = BookReader.searching.arguments[0];
		BookReader.searchWord = q;
		for(var o = oo;o;o=o.nextSibling){
			if(o.nodeType == 3) {
				var result = o.nodeValue.toUpperCase().indexOf(q.toUpperCase());
				if(result >= 0){
					$("input#searchBoxText").css("background-color", "#ffffcc");
					if(BookReader.stock.length==0 || BookReader.stock[BookReader.stock.length-1][0]!=o.parentNode)
						BookReader.stock.push([o.parentNode,o.parentNode.cloneNode(true)]);
					if(result)o = o.splitText(result);
					if(q.length != o.nodeValue.length)
						o.splitText(q.length);
					var span = document.createElement('span');
					span.className = 'searchItem';
					span.appendChild(
						document.createTextNode(o.nodeValue));
					o.parentNode.replaceChild(span,o);
					o = span;
				}
			} else if(o.firstChild) BookReader.searchSub(o.firstChild);
		}
	},
	// フォーカス時にテキストボックスの色を変える
	colorfulInput:function() {
		this.skip  = [];
		this.color = { 'blur': '', 'focus': '#EEEEEE' };
		
		this.set = function() {
			for (var i = 0; i < document.forms.length; i++) {
				for (var f = 0; f < document.forms[i].length; f++) {
					var elm = document.forms[i][f];
					if(!this._checkSkip(elm)) continue;
					
					this._setColor(elm, 'focus');
					this._setColor(elm, 'blur');
				}
			}
		}
		
		this._checkSkip = function(elm) {
			for(var i in this.skip) {
				if(elm.type == this.skip[i]) return false;
			}
			return true;
		}
		
		this._setColor = function(elm, type) { 
			var color = this.color[type];
			var event = function() { elm.style.backgroundColor = color; };
			
			if(elm.addEventListener) {
				elm.addEventListener(type, event, false); 
			} else if(elm.attachEvent) {
				elm.attachEvent('on'+type, event); 
			} else {
				elm['on'+type] = event;
			}
		}
	},
};

BookReader.Utils={
	dividelines:function(str, maxletter){
		var kinsokuOkuri='「『（〈([{';var kinsokuModoshi='。、」』）〉.,!)]}';
		str=escape(str);
		lines=[];
		pos=0, n=0, len=0, dif=1, w=1, tag=false, tagstr='', tagpos=-1, entity=false, entstr='', nobr=false;
		while (pos < str.length){
			if(str.charAt(pos) == "%" && str.charAt(pos+1) == "u"){
				dif=6, w=0.75;
			} else if(str.charAt(pos) == "%"){
				dif=3, w=0.3;
			} else {
				dif=1, w=0.39;
			} 
			c=unescape(str.substr(pos, dif));
			if(c == '<'){
				tag=true;
				tagpos=pos;
			} 
			if(!tag && c == '&'){
				entity=true;
			} 
			if(tag){
				tagstr+=c;
				pos+=dif;
				len+=0;
			} else if(entity){
				entstr+=c;
				pos+=dif;
				len+=0;
			} else {
				if(len == 0 && pos > 0　&& kinsokuModoshi.indexOf(c) > -1){
					lines[lines.length-1]+=c;
					pos+=dif;
					len=0;
					n=pos;
				} else {
					if(len == 0){
						lines.push(c);
					}　else {
						lines[lines.length-1]+=c;
					} 
					pos+=dif;
					len+=w;
					nobr=false;
				}
			} 
			if(c == '>' && tagstr != ''){
				tagname=tagstr.match(/\w+/i).toString().toUpperCase(); // タグの名称、大文字で
				closing=(null != tagstr.match(/\/\w+/i)); // 閉じタグかどうか
				o='';
				getAtt=function(str, attlist){ // 属性の習得
					temp={};
					$.each(attlist.split(','), function(attname){
						r=new RegExp(this+'=\"([^\"]*)\"', 'i');
						r2=new RegExp(this+'=([^\"\s>]+)', 'i');
						if(t=str.match(r)){
							temp[attname]=t[1];
						} else if(t=str.match(r2)){
							temp[attname]=t[1];
						} else {
							temp[attname]='';
						}
					});
					return temp;
				};
				switch (tagname){
				case 'DIV':
				case 'SPAN':
				case 'SCRIPT':
				case 'NOSCRIPT':
				case 'OBJECT':
				case 'PARAM':
				case 'EMBED':
				case 'STRONG':
				case 'STRIKE':
				case 'EM':
				case 'I':
				case 'B':
				case 'DEL':
					o=tagstr;
					break;
				case 'A':
					if(closing){
						o=tagstr;
					} else {
						att=getAtt(tagstr, 'name,href,target');
						if(att[0]) 
							BookReader.AnchorStack.push(att[0]);
						o='<a';
						if(att[1]){
							o+=' href="'+att[1]+'"';
							if(att.target) 
								o+=' target="'+att[1]+'"';
							if((!att.target || att[1] == '_self') && (null != att[1].match(/^#/i))) 
								o+=' onclick="BookReader.go2anchor(\''+att.href+'\');"';
						} 
						o+='>';
					} 
					break;
				case 'BR':
					if(nobr){nobr=false} else {o=tagstr};
					break;
				case 'HR':
					lines.push('<HR />');
					len=0;
					break;
				case 'TABLE':
				case 'TD':
				case 'TR':
				case 'TH':
					if(closing){
						o=tagstr;
					}else{
						letterwidth=BookReader.Theme.LineWidth / maxletter;
						att=getAtt(tagstr, 'border,bordercolor,background,bgcolor,align,cellpadding,cellspacing,height,width,hspace,vspace');
						if(!att[8]) att[8]=letterwidth*2.0;
						o='<' + tagname + ' border="' + att[0] + '" bordercolor="' + att[1] + '" background="' + att[2]
							+ '" bgcolor="' + att[3] + '" align="' + att[4] + '" cellpadding="' + att[5] + '" cellspacing="'
							+ att[6] + '" height="' + att[7] + '" width="' + att[8] + '" hspace="' + att[9] + '" vspace="' + att[10] + '">';
						len+=att[8]/letterwidth;
					}
					break;
				case 'IMG':
					letterwidth=BookReader.Theme.LineWidth / maxletter;
					att=getAtt(tagstr, 'src,width,alt,class');
					if(!att[1]) att[1]=letterwidth*2.0;
					if(att[3] != 'illustration'){
						o='<img src="'+att[0]+'" style="" width="'+att[1]+'" alt="'+att[2]+'">';
						len+=att[1]/letterwidth;
					}
					break;
				}
				if(o){
					if(len == 0){
						lines.push(o);
					} else {
						lines[lines.length-1]+=o;
					} 
					len+=0.1;
				} 
				if(tagname == 'BR' || (tagname == 'DIV' && closing)){
					len=0;
					n=pos;
				} 
				tag=false;
				tagstr='';
				tagpos=-1;
			} 
			if(entity && c == ';'){
				if(len == 0){
					lines.push(entstr);
				} else {
					lines[lines.length-1]+=entstr;
				} 
				len+=1;
				entity=false;
				entstr='';
			} 
			if(len >= maxletter || pos == str.length){
				if(kinsokuOkuri.indexOf(c) > -1){
					lines[lines.length-1]=lines[lines.length-1].substr(0,lines[lines.length-1].length-1);
					n=pos-dif;
					len=w;
					lines.push(c);
				} else {
					n=pos;
					len=0;
				} 
				nobr=true;
			}
		} 
		return lines;
	}
};


BookReader.loadTheme();
$(function(){
	BookReader.autoload();
	BookReader.resizeon();
	$("#br_contents").show();
});
//Event.observe(window, 'load', function(){
//	BookReader.autoload();
//});
