// ==UserScript==
// @name           DS Koordinaten Kopierer
// @description    Kopiert Dorf-Koordinaten
// @author         Michael Richter
// @namespace      http://osor.de/
// @include        http://de*.die-staemme.de/*
// ==/UserScript==

// -----------------------------------------------------------------------------
//      Modifikationen und Weiterverbreitung dieses Scripts benötigen die 
//                           Zustimmung des Autors.
// -----------------------------------------------------------------------------

mousex = 0;
mousey = 0;
ctrlpressed = false;
altpressed = false;

(function(){

	var $x = function(p, context) {
		if(!context)
			context = document;
		var i, arr = [], xpr = document.evaluate(p, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
		for (i = 0; item = xpr.snapshotItem(i); i++)
			arr.push(item);
		return arr;
	};
	
	var getPos = function(el) {
		if(typeof(el.offsetParent) != 'undefined') {
			for(var x = 0, y = 0; el; el = el.offsetParent) {
				x += el.offsetLeft;
				y += el.offsetTop;
			}
			return {left: x, top: y};
		} else {
			return {left: el.x, top: el.y};
		}
	};
	
	var getText = function(el) {
		var text = '';
		for(var i = 0; i < el.childNodes.length; i++) {
			if(el.childNodes[i].nodeType == 3) {
				text += el.childNodes[i].nodeValue + ' ';
			}
		}
		return text;
	};
	
	var getMouseElements = function(nodes) {
		var x = mousex + window.pageXOffset;
		var y = mousey + window.pageYOffset;
		var node, pos;
		for(var i = 0; i < nodes.length; i++) {
			if(pos = getPos(nodes[i])) {
				if(pos.top < y && pos.top + nodes[i].offsetHeight > y && pos.left < x && pos.left + nodes[i].offsetWidth > x) {
					node = nodes[i];
				}
			}
		}
		return node;
	};
	
	document.addEventListener("mousemove", function(evt){
		mousex = evt.clientX;
		mousey = evt.clientY;
	}, true);

	document.addEventListener("keydown", function(evt){
		if(evt.keyCode == 17)
			ctrlpressed = true;
		else if(evt.keyCode == 18)
			altpressed = true;
	}, false);
	
	document.addEventListener("keyup", function(evt){
		if(evt.keyCode == 17)
			ctrlpressed = false;
		else if(evt.keyCode == 18)
			altpressed = false;
	}, false);
	
	document.addEventListener('keypress', function(evt){
		if(ctrlpressed || altpressed)
			return;
		var code = evt.charCode || evt.keyCode;
		if(code == 99) { //c = copy
			var choose = document.getElementById('copycoordschooser');
			if(choose) {
				choose.parentNode.removeChild(choose);
			}
			var node;
			if(/screen=map/.test(location.href)) {
				if(node = getMouseElements($x('//a[contains(@onmouseover,"map_popup")]'))) {
					var coord = /'.*? \((\d+\|\d+)\) K\d+'/.exec(node.getAttribute('onmouseover'));
					if(coord) {
						document.cookie = 'copycoords=' + coord[1];
						return;
					}
				}
			}
			if(node = getMouseElements($x('//*[text()]'))) {
				if(node.nodeName == 'TEXTAREA' || node.nodeName == 'INPUT') {
					return;
				}
				var text = getText(node);
				var m;
				var coords = [];
				while(m = /(\d+\|\d+)/.exec(text)) {
					coords.push(m[1]);
					text = text.substr(text.indexOf(m[1]) + m[1].length);
				}
				
				if(coords.length > 1) {
					var chooser = document.createElement('div');
					chooser.id = 'copycoordschooser';
					chooser.setAttribute('style', 'position: absolute; z-index: 1000; left: '+x+'px; top: '+y+'px; background-color: #f6f2e7; padding: 2px; border: 2px solid #804000;');
					var head = document.createElement('div');
					head.setAttribute('style', 'background-color: #e1d7bc; font-weight: bold;');
					head.textContent = 'Wählen... ';
					var close = document.createElement('a');
					close.href = '#';
					close.textContent = '×';
					close.addEventListener('click', function(evt){
						var el = document.getElementById('copycoordschooser');
						el.parentNode.removeChild(el);
					}, false);
					head.appendChild(close);
					chooser.appendChild(head);
					for(var i = 0; i < coords.length; i++) {
						var entry = document.createElement('div');
						entry.setAttribute('style', 'padding: 1px;');
						var a = document.createElement('a');
						a.href = '#';
						a.textContent = coords[i];
						a.addEventListener('click', function(evt){
							document.cookie = 'copycoords=' + evt.target.textContent;
							var el = document.getElementById('copycoordschooser');
							el.parentNode.removeChild(el);
						}, false);
						entry.appendChild(a);
						chooser.appendChild(entry);
					}
					document.body.appendChild(chooser);
				} else if(coords.length == 1) {
					document.cookie = 'copycoords=' + coords[0];
				} else {
					document.cookie = 'copycoords=';
				}
			}
		} else if(code == 118) { //v = paste
			var coords = /copycoords=(\d+)\|(\d+)/.exec(document.cookie)
			if(!coords) return;
			var formx = document.getElementsByName("x");
			var formy = document.getElementsByName("y");
			if(formx && formy) {
				formx[0].value = coords[1];
				formy[0].value = coords[2]; 
			}
		}
	}, false);

})();

