// ==UserScript==
// @name           Wikipedia What links here
// @namespace      http://libelabo.jp/
// @description    Show "What links here" in Wikipedia Page
// @include        http://ja.wikipedia.org/wiki/*
// @include        http://ja.wikipedia.org/w/*
// ==/UserScript==

(function() {
	
	var limit = 50;
	
	var title = document.evaluate('//div[@id="content"]/h1',document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.innerHTML;
	var search_url = 'http://ja.wikipedia.org/w/index.php?title=%E7%89%B9%E5%88%A5:Whatlinkshere/'+encodeURIComponent(title)+"&limit="+limit;
	
	function waiting_img() {
		var img = document.createElement('img');
		var data = 'data:image/gif;base64,'+
			'R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4'+
			'bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklr'+
			'E2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAA'+
			'EAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUk'+
			'KhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9'+
			'HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYum'+
			'CYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzII'+
			'unInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAF'+
			'ACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJ'+
			'ibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFG'+
			'xTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdce'+
			'CAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==';
		img.src = data;
		return img;
	}
	
	function setTrackback(search_url){
		for(var i=trackback_body.childNodes.length-1; i>=0; i--){
			trackback_body.removeChild(trackback_body.childNodes[i]);
		}
		trackback_body.appendChild(waiting_img);
		
		GM_xmlhttpRequest({
			method: "GET",
			url: search_url,
			onload: function(req) {
				var res = document.createElement('div');
				res.innerHTML = req.responseText;
				
				var ul_result = document.evaluate('.//div[@id="bodyContent"]/ul',res,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
				trackback_body.removeChild(waiting_img);
				
				if(!ul_result.singleNodeValue){
					var notfound_p = document.evaluate('.//div[@id="bodyContent"]/p',res,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;
					trackback_body.appendChild(notfound_p);
				} else {
					var setNavigation = function(){
						var navi_div = document.createElement('div');
						navi_div.setAttribute('class','trackback-navi')
						trackback_body.appendChild(navi_div);
						
						var resolve_navi = function (navi) {
							var navi_result = document.evaluate('.//div[@id="bodyContent"]/a[contains(text(),"'+navi+'")][contains(@href,":Whatlinkshere")]',res,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
							if(navi_result.singleNodeValue) {
								var navi_a = navi_result.singleNodeValue;
								navi_a.addEventListener("click",function(event){ setTrackback(navi_a.href); event.preventDefault(); },false);
								navi_div.appendChild(document.createTextNode('\uFF08'));
								navi_div.appendChild(navi_a);
								navi_div.appendChild(document.createTextNode('\uFF09'));
							} else {
								res.innerHTML.match(new RegExp('(\uFF08'+navi+'.*?\uFF09)'));
								navi_div.appendChild(document.createTextNode(RegExp.$1));
							}
						}
						resolve_navi('\u524D'); // previous
						resolve_navi('\u6B21'); // next
					}
					
					setNavigation();
					trackback_body.appendChild(ul_result.singleNodeValue);
					setNavigation();
				}
			}
		});
	}
	
	var trackback_div = document.createElement('div');
	trackback_div.setAttribute('id','p-trackback');
	trackback_div.setAttribute('class','portlet');
	
	var trackback_h5 = document.createElement('h5');
	var trackback_link = document.createElement('a');
	trackback_link.href = search_url;
	trackback_link.innerHTML = '\u3053\u306E\u8A18\u4E8B\u3078\u306E\u30C8\u30E9\u30C3\u30AF\u30D0\u30C3\u30AF'
	trackback_h5.appendChild(trackback_link);
	trackback_div.appendChild(trackback_h5);
	
	var trackback_body = document.createElement('div');
	trackback_body.setAttribute('class','pBody');
	trackback_div.appendChild(trackback_body);
	
	var waiting_img = waiting_img();
	
	var left_column = document.getElementById('column-one');
	left_column.insertBefore(trackback_div,document.getElementById('p-tb'));
//	left_column.appendChild(trackback_div);
	
	setTrackback(search_url);
	
})();
