// ==UserScript==
// @name           showYinAndYangS.user.js
// @namespace      http://furyu.tea-nifty.com/
// @description    Yin and Yang ver.0.02p4: show preview of the linked page for SeaHorse
// @include        http://*
// @type           SleipnirScript
// ==/UserScript==
//
// author: furyu							http://furyu.tea-nifty.com/annex/
//
// use SITEINFO for AutoPagerize			http://userscripts.org/scripts/show/8551
// powered by JavaScript XPath				http://coderepos.org/share/wiki/JavaScript-XPath
//
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html

(function(){
var	showYinAndYang=function(win){

// === Options
var	JS_XPATH='http://furyu-tei.sakura.ne.jp/script/javascript-xpath-0.1.9-cmp.js';
//	*** Original
//	var	JS_XPATH='http://svn.coderepos.org/share/lang/javascript/javascript-xpath/trunk/release/javascript-xpath-latest.js';
//	var	JS_XPATH='http://svn.coderepos.org/share/lang/javascript/javascript-xpath/trunk/release/javascript-xpath-latest-cmp.js';

var	update=~~(new Date().getTime()/(24*3600*1000));
var	LDR_SITEINFO='http://furyu-tei.sakura.ne.jp/script/wedataSiteinfoLDR.js?update='+update;
	//	from 'http://wedata.net/databases/LDRFullFeed/items.json?callback=wedataCallbackLDR'
var	AP_SITEINFO='http://furyu-tei.sakura.ne.jp/script/wedataSiteinfoAP.js?update='+update;
	//	from 'http://wedata.net/databases/AutoPagerize/items.json?callback=wedataCallbackAP'

var	SITEINFO=[
	{	//	Google
		url				:	'http://(.*)\\.google.+/(search).+'
	,	pageElement		:	'//div[@id=\"res\"]//div[@class="g"]'
	,	exampleUrl		:	'http://www.google.com/search?q=nsIObserver'
	}
,	{	//	RRO
		url				:	'http://.+-nifty\\.com/.*$'
	,	pageElement		:	'//div[@class="entry"]'
	,	exampleUrl		:	'http://furyu.tea-nifty.com/'
	}
];

var	headerSizes=['18px','16px','14px','13px','12px'];	//	<h1>,<h2>,<h3>,<h4>,<h5>
var	charColor='navy';			// color of character
var	bgColor='white';			// color of background
//var	linkColor='#0000ee';	// color of link
var	linkColor='navy';			// color of link
var	visitColor='#551a8b';		// color of visited-link
var	charSize='12px';			// default character size

var	advLoadImage=true;
var	advLoadMax=10;
var	jumponload=true;
var	showInfo=false;
var	linkOverWait=200;	// 300200
var	linkOverColor='pink';

var	marginTop=24;
var	reqTimeout=30;	// sec

// === Preparation
var	w=(win)?win:window,d=w.document;
var	sleipnir=w.sleipnir;


if (w._yyinitialized_) return;
w._yyinitialized_=true;

try {
	var	frames=d.getElementsByTagName('frame');
}
catch(e) {
	return;
}
if (0<frames.length) {
	for (var ci=0,len=frames.length; ci<len; ci++) {
		try {
			var	cwin=frames[ci].contentWindow;
			cwin.sleipnir=sleipnir;
			arguments.callee(cwin);
			cwin.sleipnir=null;
		}
		catch (e) {};
	}
	return;
}

var	yySwitches=[];

// === Functions
var	setEventHandler=(function(){
	var	handlerList=[],firstcall=true,completed=false;
	var	execFunctions=function(){
		for (var ci=0,len=handlerList.length; ci<len; ci++) handlerList[ci]();
		handlerList=[];
		completed=true;
	};
	if (w.attachEvent && w.navigator.userAgent.match(/msie/i)) {
		var	setHandler=function(obj,evt,handler){
			if (evt=='keypress') evt='keydown';
			if (evt=='load'&&obj==w) {
				if (completed||d.readyState=='complete') {
					handler();
				}
				else {
					handlerList[handlerList.length]=handler;
					if (firstcall) {
						d.write('<script type="text/javascript" defer src="javascript:void(0)"><\/script>');
						var	scripts=d.getElementsByTagName('script'),script=scripts[scripts.length-1];
						script.onreadystatechange=function(){
							if (script.readyState=='complete') execFunctions();
						};
						firstcall=false;
					}
				}
			}
			else {
				obj.attachEvent('on'+evt,handler)
			}
		};
		setHandler(w,'load',function(){});	//	dummy
		return setHandler;
	}
	else if (w.addEventListener) {
		if (w.navigator.userAgent.indexOf('AppleWebKit/') > -1) {
			return function(obj,evt,handler){
				if (evt=='load'&&obj==w) {
					var	stat=d.readyState;
					if (completed||stat=='loaded'||stat=='complete') {
						handler();
					}
					else {
						handlerList[handlerList.length]=handler;
						if (firstcall) {
							(function(){
								var	stat=d.readyState;
								if (stat=='loaded'||stat=='complete') execFunctions(); else setTimeout(arguments.callee,50);
							})();
							firstcall=false;
						}
					}
				}
				else {
					obj.addEventListener(evt,handler,false)
				}
			}
		}
		else {
			return function(obj,evt,handler){
				if (evt=='load'&&obj==w) {
					try {d.addEventListener("DOMContentLoaded",handler,false)} catch(e){obj.addEventListener(evt,handler,false)}
				}
				else {
					if (evt=='mousewheel'&&w.navigator.userAgent.match(/Firefox/i)) evt='DOMMouseScroll';
					obj.addEventListener(evt,handler,false);
				}
			};
		}
	}
	else {
		return function(obj,evt,handler){var org=obj['on'+evt];obj['on'+evt]=function(){if(typeof org=='function')org();handler()}};
	}
})();	//	end of setEventHandler()

var	getElementsByTagAndClassName=function(tagName,className,parent) {
	if (!parent) parent=d;
	var children=parent.getElementsByTagName(tagName);
	var elements=[];
	if (className) {
		var	chkElms=(typeof className=='object')?className:className.split(' ');
		var	flgElms=[];
		for (var ci=0,len=chkElms.length; ci<len; ci++) flgElms[chkElms[ci]]=true;
		for (var ci=0,leni=children.length; ci<leni; ci++) {
			var child=children[ci];
			var cname=child.className;
			if (!cname) continue;
			var cnameElms = cname.split(' ');
			for (var cj=0,lenj=cnameElms.length; cj<lenj; cj++) {
				if (flgElms[cnameElms[cj]]) {
					elements[elements.length]=child;
					break;
				}
			}
		}
		return elements;
	}
	else {
		for (var ci=0,leni=children.length; ci<leni; ci++) elements[elements.length]=children[ci];
	}
	return elements;
}	//	end of getElementsByTagAndClassName()

var	removeElementsByTagName=function(tag,base){
	var	elms=base.getElementsByTagName(tag);
	try {
		while (0<elms.length) {
			elms[0].parentNode.removeChild(elms[0]);
		}
	}
	catch(e){}
};	//	end of removeElementsByTagName()

var	loadScript=function(src,charset){
	var	callScript=d.createElement('script');
	callScript.type="text/javascript";
	callScript.charset=(charset)?charset:'utf-8';
	callScript.src=src;
	d.body.appendChild(callScript);
};	//	end of loadScript()

var	getXmlHttpObj=(function(){
	return function(){return sleipnir.CreateObject('Msxml2.XMLHTTP')};
})();	//	end of getXmlHttpObj()

var	getPageRequest=function(path,callback,referer){
	var	ret=false;
	for (;;) {
		if (!path) break;
		var	xh=getXmlHttpObj();
		if (!xh) break;
		var	async=false,tid=null;
		if (typeof callback=='function') {
			tid=setTimeout(function(){
				tid=null;
				xh.abort();
				callback('',path,referer);
			},reqTimeout*1000);
			xh.onreadystatechange = function() {
				for (;;) {
					if (xh.readyState!=4) break;
					if (!tid) break;
					clearTimeout(tid);
//					callback((xh.status==200)?xh:'',path,referer);	// cause stack overflow
					setTimeout(function(){callback((xh.status==200)?xh:'',path,referer);},0);
					break ;
				}
			};
			async=true;
		}
		try {
			xh.open('GET',path.replace(/#.*$/,''),async);
			xh.setRequestHeader('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
			xh.setRequestHeader('Content-Type',"text/plane; charset="+d.charset);
			if (path.match(new RegExp('^https?:\/\/'+w.location.host))) {
				if (d.cookie!='') xh.setRequestHeader('Cookie',d.cookie);
			}
//			xh.setRequestHeader('Referer:',(referer)?referer:w.location.href);
			xh.setRequestHeader('Referer:',(referer)?referer:'');
			xh.send('') ;
			ret=(async)?true:xh;
		}
		catch(e){
			if (async&&tid) {
				clearTimeout(tid);
//				callback('',path,referer);	// cause stack overflow
				setTimeout(function(){callback('',path,referer);},0);
				
			}
		}
		break ;
	}
	return ret ;
};	//	end of getPageRequest()

var	xpathGetElements=function(xpath,base){
	var	hNodes=[];
	if (!base) base=d;
	try {
		var nsnaps=d.evaluate(xpath,base,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
		for (var ci=0,len=nsnaps.snapshotLength; ci<len; ci++) {
			hNodes[ci]=nsnaps.snapshotItem(ci);
		}
	} catch(e){}
	return hNodes;
};	//	end of xpathGetElements()

var	xpathGet1stElement=function(xpath,base){
	if (!base) base=d;
	try {
		return d.evaluate(xpath,base,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;
	}
	catch(e){
		return null;
	}
};	//	end of xpathGet1stElement()

var	cancelBubble=function(e){
	if (!e) e=w.event;
	if (!e) return;
	if (e.stopPropagation) {
		e.preventDefault();
		e.stopPropagation();
	}
	else {
		e.returnValue=false;
		e.cancelBubble=true;
	};
	return false;
};	//	end of cancelBubble()

var	cssAddRule=(function(){
	var	d=document;
	var	styleElm=d.createElement('style');
	styleElm.type='text/css';
	try {
		d.getElementsByTagName('head')[0].appendChild(styleElm);
	}
	catch(e){
		return function(){};
	}
	var	s=d.styleSheets[d.styleSheets.length-1];
	if (s.addRule) {			// for IE
		return function(selector,property){
			s.addRule(selector,'{'+property+'}');
		};
	}
	else if (s.insertRule) {	// for others
		return function(selector,property){
			s.insertRule(selector+'{'+property+'}',s.cssRules.length);
		};
	}
	else return function(){};
})();	//	end of cssAddRule()

var	getClientHeight=(function(){
	if (d.compatMode=='CSS1Compat') {
		var	dummy=d.documentElement.clientHeight;
		return function() {return d.documentElement.clientHeight};
	}
	else {
		var	dummy=d.body.clientHeight;
		return function() {return d.body.clientHeight};
	}
})();	//	end of getClientHeight()

var	getClientWidth=(function(){
	if (d.compatMode=='CSS1Compat') {
		var	dummy=d.documentElement.clientWidth;
		return function() {return d.documentElement.clientWidth};
	}
	else {
		var	dummy=d.body.clientWidth;
		return function() {return d.body.clientWidth};
	}
})();	//	end of getClientWidth()

var	getScrollTop=(function(){
	if (d.compatMode=='CSS1Compat') {
		return function() {return d.documentElement.scrollTop};
	}
	else {
		return function() {return d.body.scrollTop};
	}
})();	//	end of getScrollTop()

var	getObjectTop=(function(){
	if (w.navigator.userAgent.match(/msie/i)) {
		return	function(obj){
			var	style=obj.currentStyle;
/*
//			var	trng=d.body.createTextRange();
//			trng.moveToElementText(obj);
//			var	oTop=trng.offsetTop-(parseInt(style.paddingTop)||0)-(parseInt(style.borderTopWidth)||0);
*/
			var	pos=obj.getBoundingClientRect();
			var	oTop=pos.top;
			if (d.compatMode=='CSS1Compat') {
				oTop+=d.documentElement.scrollTop-d.documentElement.clientTop;
			}
			else {
				var	bstyle=d.body.currentStyle;
				oTop+=d.body.scrollTop-(parseInt(bstyle.borderTopWidth)||0);
			}
			return oTop;
		};
	}
	else {
		return	function(obj){
			var	chkflg=false;
			try {
				var style=obj.currentStyle||d.defaultView.getComputedStyle(obj,'');
				if (style.display=='none') {
					var	bkdisplay=obj.style.display;
					obj.style.display='block';
					chkflg=true;
				}
			} catch(e){}
			var offsetTop=0,curObj=obj;
			try {
				while (curObj) {
					var	style=curObj.currentStyle||d.defaultView.getComputedStyle(curObj,'');
					offsetTop+=curObj.offsetTop+(parseInt(style.borderTopWidth)||0);
					curObj=curObj.offsetParent;
				}
			} catch(e){}
			if (chkflg) obj.style.display=bkdisplay;
			return offsetTop;
		};
	}
})();	//	end of getObjectTop()

var	scrollIntoView=function(obj){
//	obj.scrollIntoView(true);
	w.scrollTo(Math.max(d.documentElement.scrollLeft,d.body.scrollLeft),getObjectTop(obj)+obj.offsetHeight-marginTop);
};	//	end of scrollIntoView()

var	createSwitch=function(link){
	var	self=this;
	yySwitches[yySwitches.length]=self;
	var	index=self.index=yySwitches.length;
	self.link=link;
	self.isBusy=false;
	self.isOpen=false;
	self.isLoaded=false;
	self.isEnable=false;
	var	timId=null;
	self.mousewheel=function(e){
		self.wheelHandler(e);
	};
	self.mouseover=function(e){
		if (self.isOpen) return;
		self.isEnable=false;
		if (timId) clearTimeout(timId);
		var	wtim=linkOverWait;
//		var	height=link.offsetHeight-0;
//		if (!isNaN(height)&&0<height) wtim=~~(linkOverWait*height/50);
		timId=setTimeout(function(){
			timId=null;
			self.isEnable=true;
			if (linkOverColor) {
				self.bkColor=link.style.backgroundColor;
				link.style.backgroundColor=linkOverColor;
			}
		},wtim);
	};
	self.mouseout=function(e){
		if (timId) {
			clearTimeout(timId);
			timId=null;
		}
		if (typeof self.bkColor!='undefined') link.style.backgroundColor=self.bkColor;
		self.isEnable=false;
	};
	setEventHandler(link,'mousewheel',self.mousewheel);
	setEventHandler(link,'mouseover',self.mouseover);
	setEventHandler(link,'mouseout',self.mouseout);
	
	self.syySwitch=function(){
		if (self.isOpen) {
			self.yyClose();
		}
		else {
			self.yyOpen();
		}
	};
	link.setAttribute('syySwitch',index);
	
};	//	end of createSwitch()

var	recentIndex=0;

createSwitch.prototype.wheelHandler=function(e){
	if (!e) e=w.event;
	if (!e) return false;
	var	self=this;
	var	delta=0;
	if (e.wheelDelta) {
		delta=e.wheelDelta/120;
//		if (w.opera) delta=-delta;
	}
	else if (e.detail) {
		delta=-e.detail/3;
	}
	var	ekey=e.altKey||e.shiftKey||e.ctrlKey;
	if (delta<0) {	//	down
		if (typeof self.bkColor!='undefined') self.link.style.backgroundColor=self.bkColor;
		if (ekey) {
			if (!self.isOpen) return true;
			scrollIntoView(self.bindexObj);
		}
		else {
			if (!self.isEnable) return true;
			if (self.isOpen) return true;
			self.yyOpen();
		}
	}
	else {			//	up
		if (ekey) {
			if (!self.isOpen) return true;
//			scrollIntoView(self.indexObj);
			scrollIntoView(self.link);
		}
		else {
			if (!self.isOpen) return true;
			self.yyClose();
		}
	}
	return cancelBubble(e);
};	//	end of wheelHandler()

createSwitch.prototype.yyOpen=function(){
	var	self=this;
	if (self.isBusy||self.isOpen) return;
	self.isBusy=true;
	
	var	link=self.link,pnode=link.parentNode;
	var	blockquote=self.blockquote,indexObj=self.indexObj,bindexObj=self.bindexObj;
	if (!blockquote) {
		self.tim_start=new Date().getTime();
		var	index=self.index;
		var	indexStr='[*'+index+']';
		indexObj=self.indexObj=d.createElement('div');
		indexObj.innerHTML='<a id="_yyid'+index+'"><\/a>'+indexStr;
		indexObj.className='syyIndex';
		setEventHandler(indexObj,'mousewheel',function(e){self.wheelHandler(e)});
		
		var	blockquote=self.blockquote=d.createElement('blockquote');
		blockquote.className='syyblockquote';
		blockquote.style.border='dashed 3px orange';
		
		var	bindexObj=self.bindexObj=d.createElement('div');
		bindexObj.className='syyBlockIndex';
		bindexObj.innerHTML='<a id="_yybid'+index+'"><\/a><a href="#_yyid'+index+'" class="syyLink" target="_self">'+indexStr+'<\/a>';
		
		var	yyLink=bindexObj.getElementsByTagName('a')[1];
		yyLink.href='javascript:void(0)';
//		setEventHandler(bindexObj,'click',function(e){scrollIntoView(indexObj)});
		setEventHandler(bindexObj,'click',function(e){scrollIntoView(self.link)});
		
		var	bloading=self.bloading=d.createElement('div');
		bloading.className='syyLoading';
		bloading.innerHTML='<nobr>loading...<\/nobr>';
		
		blockquote.appendChild(bloading);
		blockquote.appendChild(bindexObj);

		setEventHandler(bindexObj,'mousewheel',function(e){self.wheelHandler(e)});
		setEventHandler(blockquote,'mousewheel',function(e){
			if (!e) e=w.event;
			if (!e) return false;
			if (e.altKey||e.shiftKey||e.ctrlKey) {
				self.wheelHandler(e);
			}
		})
	}
	try {
		pnode.insertBefore(blockquote,link.nextSibling);
	}
	catch(e){
		try {
			pnode.appendChild(blockquote);
		}
		catch(e){
			return false;
		}
	}
	pnode.insertBefore(indexObj,blockquote);
	self.isOpen=true;
	
	var	setVisible=function(){
		var	tmpNode=pnode;
		while (tmpNode) {
			if (tmpNode.nodeType!=1||tmpNode.tagName.toUpperCase()=='BODY') break;
			if (!tmpNode._overflow) tmpNode._overflow=tmpNode.style.overflow;
			tmpNode.style.overflow='visible';
			tmpNode=tmpNode.parentNode;
		}
	}
	if (self.isLoaded) {
		if (jumponload) {
//			scrollIntoView(self.indexObj);
			scrollIntoView(self.link);
		}
		setVisible();
		self.isBusy=false;
	}
	else {
		recentIndex=self.index;
		var	imgObj=null,isImage=false;
		getPageRequest(self.link.href,function(xh){
			self.tim_loadComplete=new Date().getTime();
			if (!imgObj) blockquote.removeChild(self.bloading);
			var	rspText='';
			if (xh) {
				var	ch=xh.getResponseHeader("Content-Type");
				var	rspErr='<div class="syyWarning">('+ch+')<\/div>';
				if (ch.match(/text\/html/i)) {
					try {
						var	charset='_autodetect';
						if (ch.match(/charset\s*=\s*([^\s]*)\s*$/mi)) {
							charset=RegExp.$1.toLowerCase();
						}
						else {
							if (xh.responseText.match(/<meta[^>]+charset\s*=\s*([^\s]*)\s*["']/mi)) {
								charset=RegExp.$1.toLowerCase();
							}
						}
						if (charset.match(/utf-8/)) {
							rspText=xh.responseText;
						}
						else {
							var	adstrm=sleipnir.CreateObject('ADODB.Stream');	//	NG: new ActiveXObject('ADODB.Stream')
							adstrm.Type=1;	// binary
							adstrm.Open();
							adstrm.Write(xh.responseBody);
							adstrm.Position=0;
							adstrm.Type=2;	//	text
							try {
								adstrm.Charset=charset;
							}
							catch(e){
								adstrm.Charset='_autodetect';
							}
							rspText=adstrm.ReadText();
							adstrm.Close();
							adstrm=null;
						}
						self.sizeinfo='length:'+rspText.length;
						rspText=self.getElementHtml(rspText);
						self.sizeinfo+=[
							'-&gt;'+rspText.length
						,	'tag:'+((self.tagCount)?self.tagCount:0)
						].join(' ');
					}
					catch(e){
						rspText='';
					}
				}
				else if (isImage||ch.match(/image/i)) {
//					rspText='<img border="0" src="'+self.link.href+'"\/>';
					if (!imgObj) {
						imgObj=new Image();
						imgObj.border=0;
						imgObj.src=self.link.href;
					}
				}
				else {
					if (imgObj) {
						imgObj=null;
						rspText=rspErr;
					}
					else {
						var	callback=arguments.callee;
						imgObj=new Image();
						imgObj.onload=function(){
							isImage=true;
							callback(xh);
						};
						imgObj.onerror=function(){
							isImage=false;
							callback(xh);
						};
						imgObj.src=self.link.href;
						return;
					}
				}
			}
			else {
				rspText='';
			}
			self.tim_processComplete=new Date().getTime();
			
			var	bwindow=d.createElement('div');
			bwindow.className='syyWindow';
			if (imgObj) {
				bwindow.appendChild(imgObj);
			}
			else if (rspText) {
				bwindow.innerHTML=rspText;
				if (advLoadImage) {
					var	timgs=bwindow.getElementsByTagName('img');
					var	patImg=new Image();
					patImg.border='0';
					var	dsrc='javascript:void(0)';
					var	imgInfos=[];
					for (var ci=0,len=timgs.length; ci<len; ci++) {
						var	tgt=timgs[ci];
						imgInfos[imgInfos.length]={
							tgt		:	tgt
						,	url		:	tgt.src
						,	display	:	tgt.style.display
						};
						tgt.style.display='none';
						tgt.src=dsrc;
					}
					var	cntLoad=0;
					var	execLoad=function(){
						if (advLoadMax<=cntLoad) return false;
						if (imgInfos.length<=0) return false;
						var	imgInfo=imgInfos.shift();
						cntLoad++;
						var	nimg=patImg.cloneNode(true);
						nimg.style.display=imgInfo.display;
						getPageRequest(imgInfo.url,function(xh,url){
							try {
								nimg.src=url;
								var	tgt=imgInfo.tgt;
								pNode=tgt.parentNode;
								pNode.insertBefore(nimg,tgt);
								pNode.removeChild(tgt);
							} catch (e) {}
							cntLoad--;
							execLoad()
						});
						return true;
					};
					while (execLoad()){};
				}
			}
			else {
				var	info=d.createElement('div');
				info.innerHTML='[iframe]';
				info.className='syyInfo';
				bwindow.appendChild(info);
				
				var	iframe=d.createElement('iframe');
				iframe.className='syyIframe';
				iframe.frameBorder='0';
				iframe.frameSpacing='0';
				iframe.style.width=~~(0.9*getClientWidth())+'px';
				iframe.style.height=~~(0.9*getClientHeight())+'px';
				iframe.src=self.link.href;
				bwindow.appendChild(iframe);
			}
//			addSwitches(bwindow);
			blockquote.insertBefore(bwindow,bindexObj);
			self.tim_showComplete=new Date().getTime();
			if (showInfo) {
				var	infoWindow=d.createElement('div');
				infoWindow.className='syyInfoWindow';
				var	details=[];
				if (self.tim_processes&&1<self.tim_processes.length) {
					for (var ci=1; ci<self.tim_processes.length; ci++) {
						details[details.length]=ci+':'+(self.tim_processes[ci]-self.tim_processes[ci-1])+'ms'
					}
				}
				infoWindow.innerHTML=[
					'total:'+(self.tim_showComplete-self.tim_start)+'ms'
				,	'load:'+(self.tim_loadComplete-self.tim_start)+'ms'
				,	'process:'+(self.tim_processComplete-self.tim_loadComplete)+'ms'+((0<details.length)?'['+details.join(' ')+']':'')
				,	'show:'+(self.tim_showComplete-self.tim_processComplete)+'ms'
				,	(self.sizeinfo)?'('+self.sizeinfo+')':''
				].join(' ');
				if (typeof self.siteinfoNo!='undefined') {
					infoWindow.innerHTML+=[
						'<br />[SITEINFO]'
					,	'length:'+self.siteinfoLen
					,	'match:'+((self.siteinfoMatch)?(self.siteinfoNo+1):'-')
					,	(self.siteinfoMatch)?"url:'"+self.siteinfoUrls[self.siteinfoUrls.length-1]+"'":''
					,	(self.siteinfoMatch)?"xpath:'"+self.siteinfoXpath+"'":''
					].join(' ');
				}
//				blockquote.insertBefore(infoWindow,bindexObj);
				blockquote.appendChild(infoWindow);
			}
			setVisible();
			if (jumponload) {
//				scrollIntoView(self.indexObj);
				scrollIntoView(self.link);
			}
			self.isLoaded=true;
			self.isBusy=false;
		});
	}
};	//	end of createSwitch.prototype.yyOpen()

createSwitch.prototype.yyClose=function(){
	var	self=this;
	if (!self.isOpen) return;
	var	link=self.link,blockquote=self.blockquote,indexObj=self.indexObj,pnode=link.parentNode;
	var	tmpNode=pnode;
	while (tmpNode) {
		if (tmpNode.nodeType!=1||tmpNode.tagName.toUpperCase()=='BODY') break;
		if (tmpNode._overflow) tmpNode.style.overflow=tmpNode._overflow;
		tmpNode=tmpNode.parentNode;
	}
	pnode.removeChild(blockquote);
//	scrollIntoView(self.indexObj);
	scrollIntoView(self.link);
	pnode.removeChild(indexObj);
	self.isOpen=false;
};	//	end of createSwitch.prototype.yyClose()

var	loadImageId=0;
var	rmvTagNames=['embed','object','iframe','form','style','script','noscript'];
var	rmvAttribs=['style','id','name','onload','onclick','onmouseover','onmousemove','onmouseout'];

var	removeElements=function(doc){
	if (!doc.getElementsByTagName) return;
	for (var ci=0,len=rmvTagNames.length; ci<len; ci++) {
		removeElementsByTagName(rmvTagNames[ci],doc);
	}
};

createSwitch.prototype.getElementHtml=function(content){
	var	self=this,result='';
	
	self.tim_processes=[new Date().getTime()]
	var	wdoc=new ActiveXObject('htmlfile');
	wdoc.designMode='on';
	wdoc.open('text/html');
	wdoc.write(content);
	wdoc.close();
	if (wdoc.getElementsByTagName('frameset')[0]) {
		wdoc=null;
		return '';
	}
	var	head=wdoc.getElementsByTagName('head')[0];
	if (head) {
		var	base=wdoc.createElement('base');
		base.href=self.link.href;
		if (head.firstChild) {
			head.insertBefore(base,head.firstChild);
		}
		else {
			head.appendChild(base);
		}
	}
	self.tim_processes[self.tim_processes.length]=new Date().getTime();	//	process1 end
	
	var	parent=wdoc.body;
	if (typeof d.evaluate!='undefined'&&0<SITEINFO.length) {
		self.siteinfoCheck=0;
		self.siteinfoUrls=[];
		var	pageUrl=self.link.href;
		for (var ci=0,leni=SITEINFO.length; ci<leni; ci++) {
			var	siteinfo=SITEINFO[ci];
			if (!siteinfo.url||!siteinfo.pageElement) continue;
			var	reurl=siteinfo.url;
			if (!reurl.match(/^\^/)) reurl='^'+reurl;
			if (reurl.match(/\/\/$/)) continue;
			if (!pageUrl.match(new RegExp(reurl))) continue;
			self.siteinfoCheck++;
			self.siteinfoUrls[self.siteinfoUrls.length]=siteinfo.url;
			var	elms=xpathGetElements(siteinfo.pageElement,wdoc);
			if (elms.length<=0) continue;
			self.siteinfoXpath=siteinfo.pageElement;
			var	tmpParent=parent=wdoc.createElement('div');
			if (elms[0].tagName) {
				switch (elms[0].tagName.toUpperCase()) {
					case	'THEAD'	:
					case	'TBODY'	:
					case	'TFOOT'	:
						tmpParent=wdoc.createElement('table');
						parent.appendChild(tmpParent);
						break;
					case	'TR'	:
						tmpParent=wdoc.createElement('tbody');
						var	tmp2Parent=wdoc.createElement('table');
						tmp2Parent.appendChild(tmpParent);
						parent.appendChild(tmp2Parent);
						break;
					case	'TH'	:
					case	'TD'	:
						tmpParent=wdoc.createElement('tr');
						var	tmp2Parent=wdoc.createElement('tbody');
						var	tmp3Parent=wdoc.createElement('table');
						tmp2Parent.appendChild(tmpParent);
						tmp3Parent.appendChild(tmp2Parent);
						parent.appendChild(tmp3Parent);
						break;
				}
			}
			for (var cj=0,lenj=elms.length; cj<lenj; cj++) {
				removeElements(elms[cj]);
				tmpParent.appendChild(elms[cj]);
			}
			break;
		}
		self.siteinfoNo=ci;
		self.siteinfoLen=leni;
		self.siteinfoMatch=(ci<leni)?true:false;
	}
	if (parent===wdoc.body) removeElements(parent);
	self.tim_processes[self.tim_processes.length]=new Date().getTime();	//	process2 end
	
	var	tgtElms=parent.getElementsByTagName('*'),imgCount=0;
	self.tagCount=tgtElms.length;
	
	var	commonClass='syyElement', headerClass='syyHeader', linkClass='syyLink';
	for (var ci=0,leni=tgtElms.length; ci<leni; ci++) {
		var	tgtElm=tgtElms[ci];

		for (var cj=0,lenj=rmvAttribs.length; cj<lenj; cj++) {
			try {
				tgtElm.removeAttribute(rmvAttribs[cj],0);
			}
			catch(e){}
		}
		var	tname=tgtElm.tagName.toUpperCase();
		switch (tname) {
			case	'A'		:
				tgtElm.href=tgtElm.href;
				tgtElm.className=linkClass;
				continue;
			case	'IMG'	:
				tgtElm.src=tgtElm.src;
//				imgLoader(tgtElm);
				tgtElm.border='0';
				tgtElm.className=commonClass;
				imgCount++;
				continue;
		}
		if (tname.match(/^H(\d)$/i)) {
			tgtElm.className=headerClass;
			var	children=tgtElm.getElementsByTagName('*');
			for (var cj=0,lenj=children.length; cj<lenj; cj++) {
				children[cj]._isheader_=true;
			}
		}
		else {
			tgtElm.className=(tgtElm._isheader_)?'':commonClass;
		}
	}
	self.tim_processes[self.tim_processes.length]=new Date().getTime();	//	process3 end
	
	result=parent.innerHTML;
	if (imgCount==0&&tgtElms.length<10) {
		if (result.replace(/([\s\r\n]|<[^>]*>)/mg,'')=='') result='';
	}
	self.tim_processes[self.tim_processes.length]=new Date().getTime();	//	process4 end
	
	parent=null;
	wdoc=null;
	
	return result;

};	//	end of createSwitch.prototype.getElementHtml()

var	addSwitch=function(link){
	try {
		var	href=link.href;
		if (!href||!href.match(/^http/)||href.match(/^https?:\/\/\//)) return null;
		if (link.getAttribute('syySwitch')) return null;
		return new createSwitch(link);
	}
	catch (e) {
		return null;
	}
};

var	addSwitches=function(doc){
	var	links=doc.getElementsByTagName('a');
	var	tgts=[];
	for (var ci=0,len=links.length; ci<len; ci++) {
		tgts[tgts.length]=links[ci];
	}
	for (var ci=0,len=tgts.length; ci<len; ci++) {
		if (!addSwitch(tgts[ci])) {
//			prompt(ci+'/'+len,tgts[ci].outerHTML);
		}
	}
};	//	end of addSwitches()

//	=== API functions
w.showYinAndYang={
	addSwitch	:	addSwitch
,	syySwitch	:	function(tgt){
		var	index=tgt.getAttribute('syySwitch');
		if (!index) {
			var	self=addSwitch(tgt);
			if (self) index=self.index;
		}
		if (index) {
			yySwitches[index-1].syySwitch();
			return true;
		}
		else {
			return false;
		}
	}
};


//	=== Main
if (typeof d.evaluate=='undefined') loadScript(JS_XPATH);

/*
//var	AutoPagerize=w.AutoPagerlike||oWindow.AutoPagerize;
//if (AutoPagerize) {
//	var	addFilter=(AutoPagerize.addElementFilter)?AutoPagerize.addElementFilter:AutoPagerize.addFilter;
//	if (addFilter) {
//		addFilter(function(nodes,url,siteinfo){
//			for (var ci=0,len=nodes.length; ci<len; ci++) {
//				addSwitches(nodes[ci]);
//			}
//		});
//	}
//}
*/

var	sicnt=0,simax=2,ldr_siteinfo=[],ap_siteinfo=[];
var	checkLoadComplete=function(){
	sicnt++;
	if (sicnt<simax) return;
	SITEINFO=SITEINFO.concat(ldr_siteinfo).concat(ap_siteinfo);
};
w.wedataCallbackLDR=function(sinfoSrc){
	for (var ci=0,len=sinfoSrc.length; ci<len; ci++) {
		var	no=ldr_siteinfo.length;
		ldr_siteinfo[no]=sinfoSrc[ci].data;
		ldr_siteinfo[no].pageElement=ldr_siteinfo[no].xpath;
	}
	checkLoadComplete();
};
w.wedataCallbackAP=function(sinfoSrc){
	for (var ci=0,len=sinfoSrc.length; ci<len; ci++) {
		ap_siteinfo[ap_siteinfo.length]=sinfoSrc[ci].data;
	}
	checkLoadComplete();
};
loadScript(LDR_SITEINFO);
loadScript(AP_SITEINFO);

//addSwitches(d);

setEventHandler(d,'mouseover',function(e){
	if (!e) e=w.event;
	var	tgt=e.target||e.srcElement;
	while (tgt) {
		if (tgt.tagName&&tgt.tagName.toUpperCase()=='A') {
			var	self=addSwitch(tgt);
			if (self) self.mouseover();
		}
		tgt=tgt.parentNode;
	}
});

cssAddRule('blockquote.syyblockquote',[
	'display:block !important'
,	'text-align:left !important;'
,	'line-height:120% !important;'
,	'font-family:verdana !important;'
,	'margin:4px !important;'
,	'padding:2px !important;'
,	'font-style:normal !important;'
,	'font-weight:normal !important;'
,	'text-decoration:none !important;'
,	'word-spacing:2px !important;'
,	'letter-spacing:0 !important;'
//,	'overflow:auto !important;'
,	'overflow:visible !important;'
,	'position:relative !important;'
,	'z-index:10000 !improtant;'
,	'min-width:640px;width:auto !important;width:640px;'
//,	'min-height:480px;height:auto !important;height:480px;'
,	'border:dashed 3px orange !important;'
,	'background:'+bgColor+' !important;'
,	'color:'+charColor+' !important;'
,	'font-size:'+charSize+' !important;'
].join(''));

cssAddRule('.syyblockquote .syyElement',[
	'text-align:left;'
,	'line-height:130%;'
,	'font-style:normal;'
//,	'font-weight:normal;'
//,	'text-decoration:none;'
,	'word-spacing:2px;'
,	'letter-spacing:1px;'
,	'background:transparent;'
,	'overflow:visible !important;'
,	'position:relative !important;'
,	'z-index:10000 !improtant;'
,	'color:'+charColor+';'
,	'font-size:'+charSize+';'
].join(''));

cssAddRule('.syyIndex','display:inline;font-size:80%;clear:both;margin:0;padding:0;text-align:left;');
cssAddRule('.syyblockquote .syyBlockIndex','font-size:10px; margin:4px 2px 16px; clear:both; text-align:left;');
cssAddRule('.syyblockquote .syyLoading','text-align:left;color:red; fontWeight:bolder;');
cssAddRule('.syyblockquote .syyInfo','font-size:10px; fontWeight:bolder; color:brown;');
cssAddRule('.syyblockquote .syyWarning','color:brown;font-weight:bolder;');
cssAddRule('.syyblockquote .syyIframe','border:solid 1px brown;');
cssAddRule('.syyblockquote .syyInfoWindow','margin:4px 2px 0; font-size:10px; color:brown; background:#ccffcc; border:lime 1px dotted; clear:both;');

cssAddRule('.syyblockquote a.syyLink','text-decoration:underline;');
cssAddRule('.syyblockquote a.syyLink','border:none;');
cssAddRule('.syyblockquote a.syyLink:link','color:'+linkColor+';');
cssAddRule('.syyblockquote a.syyLink:visited','color:'+visitColor+';');

var	hxcommon=[
	'border:none;'
,	'margin:8px 0 4px;'
,	'padding:3px;'
,	'font-style:normal;'
,	'font-weight:bolder;'
,	'text-decoration:none;'
,	'dislay:block;'
,	'clear:both;'
,	'line-height:140%;'
,	'text-align:left;'
,	'border-left:solid green 8px;'
,	'background:#ccffcc;'
,	'color:'+charColor+';'
,	'position:static'
].join('');

cssAddRule('.syyblockquote .syyHeader',hxcommon);
cssAddRule('.syyblockquote h1.syyHeader',hxcommon+'font-size:'+headerSizes[0]+';');
cssAddRule('.syyblockquote h2.syyHeader',hxcommon+'font-size:'+headerSizes[1]+';');
cssAddRule('.syyblockquote h3.syyHeader',hxcommon+'font-size:'+headerSizes[2]+';');
cssAddRule('.syyblockquote h4.syyHeader',hxcommon+'font-size:'+headerSizes[3]+';');
cssAddRule('.syyblockquote h5.syyHeader',hxcommon+'font-size:'+headerSizes[4]+';');

cssAddRule('.syyblockquote blockquote.syyElement','border:dashed 2px red; padding:3px; background:white;');
cssAddRule('.syyblockquote textarea.syyElement','border:solid 1px darkblue; padding:2px; background:white; width:80%; height:48px;');

};	//	end of showYinAndYang()

_window.sleipnir=sleipnir;
try{_window.execScript('('+showYinAndYang.toString()+')();','JavaScript');}catch(e){};
_window.sleipnir=null;

})();

