// ==UserScript==
// @name           Profile URLs Findr
// @namespace      http://libelabo.jp/
// @description    This script shows target user's other pages
// @include        *
// @author         june29
// @version        0.20071012
// ==/UserScript==

// 20071012 - release

(function() {

	// Shortcut key
	// C -- control
	// S -- shift
	// A -- alt
	var BIND_KEY = "C-m";

	var urls = [];
	var tako3url = "http://tako3.com/json/likely/";
	var fooourl  = "http://fooo.name/accounts/search/";

	var urlsPanel = document.createElement('div');
	urlsPanel.setAttribute('id', 'urlsPanel');

	var loadStarted = false;
	var tako3loaded = false;
	var foooloaded  = false;
	var displayed   = false;

	var debug = false;

	urlsPanel.style.display = 'none';

	GM_addStyle(<><![CDATA[
		div#urlsPanel {
			background-color:white !important;
			background-image:none !important;
			border-left-color:#666666 !important;
			border-left-style:solid !important;
			border-left-width:1px !important;
			border-top-color:#666666 !important;
			border-top-style:solid !important;
			border-top-width:1px !important;
			bottom:0px !important;
			color:#333333 !important;
			font-size:100% !important;
			opacity:0.9 !important;
			overflow-x:auto !important;
			overflow-y:auto !important;
			padding-left:0px !important;
			padding-right:0px !important;
			position:fixed !important;
			right:0px !important;
			text-align:left !important;
			z-index:1000 !important;
		}
		div#urlsPanel ul {
			padding: 0 20px !important;
			list-style: none !important;
			list-style-position: outside !important;
		}
		p.loadingMessage {
			padding: 0 20px !important;
		}
	]]></>);

	document.body.appendChild(urlsPanel);

	/* Ten */
	if (typeof(Ten) == 'undefined') {
		Ten = {};
	}
	/* Ten.Class */
	Ten.Class = function(klass, prototype) {
		if (klass && klass.initialize) {
			var c = klass.initialize;
		} else if(klass && klass.base) {
			var c = function() { return klass.base[0].apply(this, arguments) };
		} else {
			var c = function() {};
		}
		c.prototype = prototype || {};
		c.prototype.constructor = c;
		Ten.Class.inherit(c, klass);
		if (klass && klass.base) {
			for (var i = 0;  i < klass.base.length; i++) {
				var parent = klass.base[i];
				if (i == 0) {
					c.SUPER = parent;
					c.prototype.SUPER = parent.prototype;
				}
				Ten.Class.inherit(c, parent);
				Ten.Class.inherit(c.prototype, parent.prototype);
			}
		}
		return c;
	}
	Ten.Class.inherit = function(child,parent) {
		for (var prop in parent) {
			if (typeof(child[prop]) != 'undefined' || prop == 'initialize') continue;
			child[prop] = parent[prop];
		}
	}
	/* Ten.Function */
	Ten.Function = new Ten.Class({
		bind: function(f,o) {
			return function() {
				f.apply(o, arguments);
			}
		}
	});
	/* Ten.JSONP */
	Ten.JSONP = new Ten.Class({
		initialize: function(uri,obj,method) {
			if (Ten.JSONP.Callbacks.length) {
				setTimeout(function() {new Ten.JSONP(uri,obj,method)}, 500);
				return;
			}
			var del = uri.match(/\?/) ? '&' : '?';
			uri += del + 'callback=Ten.JSONP.callback';
			if (!uri.match(/timestamp=/)) {
				uri += '&' + encodeURI(new Date());
			}
			if (typeof(obj) == 'function' && typeof(method) == 'undefined') {
				obj = {callback: obj};
				method = 'callback';
			}
			if (obj && method) Ten.JSONP.addCallback(obj,method);
			this.script = document.createElement('script');
			this.script.src = uri;
			this.script.type = 'text/javascript';
			document.getElementsByTagName('head')[0].appendChild(this.script);
		},
		addCallback: function(obj,method) {
			Ten.JSONP.Callbacks.push({object: obj, method: method});
		},
		callback: function(args) {
			// alert('callback called');
			var cbs = Ten.JSONP.Callbacks;
			for (var i = 0; i < cbs.length; i++) {
				var cb = cbs[i];
				cb.object[cb.method].call(cb.object, args);
			}
			Ten.JSONP.Callbacks = [];
		},
		MaxBytes: 1800,
		Callbacks: []
	});

	Array.prototype.inArray = function (value) {
		var i;
		for (i=0; i < this.length; i++) {
			if (this[i] === value) {
				return true;
			}
		}
		return false;
	};

	// from SBMCommentsViewer by snj14
	// http://white.s151.xrea.com/wiki/index.php?script%2FSBMCommentsViewer
	var skipEl = {'input': true, 'button': true, 'select': true, 'textarea': true, 'password': true};
	window.addEventListener('keypress', function(e) {
		if (skipEl[e.target.tagName.toLowerCase()]) return;
		var key = ''
			+ ((e.ctrlKey)  ? 'C' : '')
			+ ((e.shiftKey) ? 'S' : '')
			+ ((e.altKey || e.metaKey)   ? 'A' : '')
			+ '-';
		key += String.fromCharCode(e.charCode).toLowerCase();
		if (key == BIND_KEY) toggle();
	}, false);

	var callbackTako3 = {
		done: function(res){
			if(typeof res == "object"){
				for(var i=0; i<res.length; i++) {
					if(!urls.inArray(res[i])) urls.push(res[i]);
				}
			} else {
				alert("can't load tako3");
			}
			tako3loaded = true;
			if(debug) console.log("tako3 loaded");
			if(foooloaded) createList();
		}
	};
	unsafeWindow['tako3'] = callbackTako3.done;

	function loadFooo() {
		GM_xmlhttpRequest({
			method:"GET", 
			url : fooourl + location.href + "?format=json",
			onload:function(res){
				var json = eval("(" + res.responseText + ")");
				if(json.length > 0){
					var members = json[0].members;
					for(var i=0; i<members.length; i++) {
						if(!urls.inArray(members[i].url)) urls.push(members[i].url);
					}
				}
				foooloaded = true;
				if(debug) console.log("fooo loaded");
				if(tako3loaded) createList();
			}
		});
	}

	function loadTako3() {
		new Ten.JSONP(tako3url + location.href, callbackTako3, 'done');
	}

	function createList() {
		if(tako3loaded && foooloaded && !displayed) {
			if(urlsPanel.hasChildNodes()) {
				if(urlsPanel.firstChild.className == 'loadingMessage') {
					if(debug) console.log("remove message");
					urlsPanel.removeChild(urlsPanel.firstChild);
				}
			}
			ul = document.createElement('ul');
			urlsPanel.appendChild(ul);
			for(var i=0; i<urls.length; i++) {
				li = document.createElement('li');
				a  = document.createElement('a');
				a.appendChild(document.createTextNode(urls[i]));
				a.setAttribute('href', urls[i]);
				li.appendChild(a);
				ul.appendChild(li);
			}
			if(tako3loaded && foooloaded && urls.length == 0) {
				if(debug) console.log("can't find related page");
				li = document.createElement('li');
				li.appendChild(document.createTextNode("can't find related page"));
				ul.appendChild(li);
			}
			displayed = true;
		}
	}

	function toggle() {
		if(debug) console.log("toggle");
		if(!loadStarted) {
			loadTako3();
			loadFooo();
			loadStarted = true;
		}
		if((!tako3loaded || !foooloaded) && !urlsPanel.hasChildNodes()) {
			if(debug) console.log("show loading message");
			p = document.createElement('p');
			p.setAttribute('class', 'loadingMessage');
			message = document.createTextNode("now loading...");
			p.appendChild(message);
			urlsPanel.appendChild(p);
		} else if((!tako3loaded || !foooloaded) && urlsPanel.hasChildNodes()) {
			if(debug) console.log("stop pushing");
			return;
		}
		urlsPanel.style.display = urlsPanel.style.display ? '' : 'none';
	}

}());
