var nk_cardlink_lng = 'de';
var nk_cardlink_external = '';

function __(s) {
	if(nk_cardlink_lng == 'en') {
		if(s == 'Suche Karte, bitte warten...') s = 'Searching for card, please wait...';
		else if(s == 'Karte nicht gefunden!') s = 'Card not found!';
		else if(s == 'Entweder ist der Kartenname falsch geschrieben'
				+ ' oder diese Karte existiert noch nicht in unserer Datenbank.')
			s = 'Either the card name is misspelled'
				+ ' or we do not have this card in our database yet.';
		else if(s == 'Für Details klicken!') s = 'Click for details!';
	}

	return s;
}

//Kartenanzeige bei Magiccards.info
function cardInfo(e, cardname) {
	if(e) {
		var url = e.href;
	} else {
		var url = "http://www.mtg-forum.de/db/magiccard.php?lng="+encodeURIComponent(nk_cardlink_lng)
		+"&card="+cardname;
	}
	
	return window.open(url,	"_blank",
			"toolbar=0, location=0, directories=0, status=0, menubar=0, scrollbars=1, resizable=1, width=800, height=600");
}

//legacy
function Kartenanzeige(cardname) {
	cardInfo(null, cardname);
}

var cardQuickInfoOn = false;
var cardCache = new Object;
var req = false;
function cardQuickInfo(a, cardname, attempt) {
	if(cardQuickInfoOn) return;
	
	if(typeof(nk_loaded) != 'undefined' && !nk_loaded) {
	//ie bricht ladevorgang ab wenn wir zu früh versuchen, diese cardCache zu lesen
		attempt = parseInt(attempt);
		if(!attempt) attempt = 0;
		attempt++;
		
		//if (attempt < 10)
		//	window.setTimeout(function() { KartenanzeigeMouseOver(cardname, attempt); }, 500);
			
		return;
	}
	
	//Overlay erzeugen
	var o = document.getElementById('kartenOverlay');
	if(!o) {
		o = document.createElement('div');
		o.id = 'kartenOverlay';
		document.body.appendChild(o);
	}
	
	//Bild
	var bild = document.getElementById('kartenOverlayBild');
	if(!bild) {
		bild = document.createElement('img');
		bild.id = 'kartenOverlayBild';
		o.appendChild(bild);
	}
	bild.style.display = 'none';
	
	//Content
	var con = document.getElementById('kartenOverlayContent');
	if(!con) {
		con = document.createElement('div');
		con.id = 'kartenOverlayContent';
		o.appendChild(con);
	} else {
		while(con.hasChildNodes())
			con.removeChild(con.firstChild);
	}
	
	cardQuickInfoCheckMouse(o);
	
	//Overlay anzeigen
	o.style.display = 'block';	
	cardQuickInfoOn = true;
	cardQuickInfoCheckMouse();
	YAHOO.util.Event.addListener(document, 'mousemove', updateMousePosition);
	
	//find cardname
	if(a && !cardname) {
		cardname = findNameFromLink(a);
	}
	
	//load card data
	if(!cardCache[cardname]) {	
		var bitteWartenText = cardQuickInfoAddText(con, 'bitteWarten', __('Suche Karte, bitte warten...'));
			
		if(req && YAHOO.util.Connect.isCallInProgress(req)) {
			YAHOO.util.Connect.abort(req);
		}
		
		var callback = {
			success: function(res) {cardQuickInfoCallBack(res)},
			failure: function(res) {cardQuickInfoCallBack(res)},
			timeout: 5000, 
			argument: [cardname, con, bild, o]
		}
			
		if(typeof(nk_cardlink_external) != 'undefined' && nk_cardlink_external) {
			req = YAHOO.util.Connect.asyncRequest('GET', nk_cardlink_external+'?card='+cardname, callback, null);
		} else {
			req = YAHOO.util.Connect.asyncRequest('GET', '/db/get.php?card='+cardname, callback, null);
		}
	} else {
		cardQuickInfoHandleResponse(o, bild, con, cardCache[cardname]);
	}
}

//figure out when the document has been loaded
if(YAHOO.util.Event) {
	YAHOO.util.Event.addListener(window, 'load', function(e) {
		nk_loaded = true;
		});	
}

//legacy
function KartenanzeigeMouseOver(cardname, attempt) {
	return cardQuickInfo(null, cardname, attempt);
}

function cardQuickInfoHide() {		
	cardQuickInfoOn = false;
}

//legacy
function KartenanzeigeMouseOut() {
	return cardQuickInfoHide();
}

function cardQuickInfoCallBack(res) {
	var cardname = res.argument[0];
	var con = res.argument[1];
	var bild = res.argument[2];
	var o = res.argument[3];
	
	//remove old content
	while(con.hasChildNodes())
		con.removeChild(con.firstChild);
		
	var json;				
	if(res.status == 200) {
		json = eval( '(' + res.responseText + ')' );
	} else {
		json = '404';
	}
	
	cardCache[cardname] = json; //cache data

	cardQuickInfoHandleResponse(o, bild, con, cardCache[cardname]);
}

function cardQuickInfoHandleResponse(o, bild, con, json) {
	if(json == '404') {
		cardQuickInfoAddText(con, 'kartenFehler', __('Karte nicht gefunden!'), 'p');
		cardQuickInfoAddText(con, 'kartenFehler', __('Entweder ist der Kartenname falsch geschrieben'
			+ ' oder diese Karte existiert noch nicht in unserer Datenbank.'), 'p');
	} else if(json) {
		cardQuickInfoDisplay(o, bild, con, json);
	}
}

function cardQuickInfoDisplay(o, bild, con, json) {
	if(json['bild_datei'] && json['bild_datei'].length)
	{		
		bild.src = json['bild_datei'];
		bild.style.display = 'block';
		o.style.width = '350px';
	} else {
		o.style.width = '210px';
	}
	
	if(json['cost'] && json['cost'].length)
		cardQuickInfoAddText(con, 'kartenKopfCost', json['cost']);
		
	if(json['name'] && json['name'].length)
		cardQuickInfoAddText(con, 'kartenKopf', json['name']);
	
	if(json['power'] && json['power'].length)
		cardQuickInfoAddText(con, 'kartenPowTough', json['power'] + '/' + json['toughness']);
		
	if(json['type'] && json['type'].length)
		cardQuickInfoAddText(con, 'kartenTyp', json['type']);
			
	
	if(json['text'] && json['text'].length) {
		var text = document.createElement('div');
		text.className = 'kartenText';
		
		var absaetze = json['text'].split("\n");
		for(var i = 0; i < absaetze.length; i++)
			cardQuickInfoAddText(text, '', absaetze[i], 'p');
			
		con.appendChild(text);
	}
	
	cardQuickInfoAddText(con, 'kartenFooter', __('Für Details klicken!'));
	
	//Mana
	con.innerHTML = con.innerHTML.replace(/\{ \}\{\/\}\{\/\}\{ \}/g, ' // ');
	con.innerHTML = con.innerHTML.replace(/\{\/([^\}]*)\}/g, '/{$1}');
	con.innerHTML = con.innerHTML.replace(/\{W\}/g, '{!MANA white_mana}');
	con.innerHTML = con.innerHTML.replace(/\{U\}/g, '{!MANA blue_mana}');
	con.innerHTML = con.innerHTML.replace(/\{B\}/g, '{!MANA black_mana}');
	con.innerHTML = con.innerHTML.replace(/\{R\}/g, '{!MANA red_mana}');
	con.innerHTML = con.innerHTML.replace(/\{G\}/g, '{!MANA green_mana}');
	con.innerHTML = con.innerHTML.replace(/\{T\}/g, '{!MANA tap}');
	con.innerHTML = con.innerHTML.replace(/\{Q\}/g, '{!MANA2 untap}');
	con.innerHTML = con.innerHTML.replace(/\{([WUBRG])\/([WUBRG])\}/g, '{!MANA Symbol_$1$2_mana}');
	con.innerHTML = con.innerHTML.replace(/\{([0-9XYZ])\}/g, '{!MANA Symbol_$1_mana}');
	con.innerHTML = con.innerHTML.replace(
			/\{!MANA ([^\}]+)\}/g,
			'<img class="mana" src="http://www.mtg-forum.de/style_images/global/icons/$1.gif" />');
	con.innerHTML = con.innerHTML.replace(
			/\{!MANA2 ([^\}]+)\}/g,
			'<img class="mana" src="http://www.mtg-forum.de/style_emoticons/neu/mana_$1.gif" />');
	//Erklaerungen
	con.innerHTML = con.innerHTML.replace(/(\([^\)]+\))/g, '<i>$1</i>');
}

function cardQuickInfoAddText(node, klasse, text, elem) {	
	if(elem == undefined) elem = 'div';
	var d = document.createElement(elem);
	d.className = klasse;
	d.appendChild(document.createTextNode(text));
	node.appendChild(d);
	
	return d;
}

var mouseX = 0; var mouseY = 0;
var mouseClientX = 0, mouseClientY = 0;
function updateMousePosition(e) {
	if (!e) e = window.event;
	
	if (e.pageX > 0 || e.pageY > 0) {
		mouseX = e.pageX;
		mouseY = e.pageY;
	} else if (e.clientX || e.clientY) {
		mouseX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		mouseY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
		
		mouseClientX = e.clientX;
		mouseClientY = e.clientY;
	}
	
	cardQuickInfoCheckMouse();
}


function cardQuickInfoCheckMouse(o) {
	if(!cardQuickInfoOn) {
		YAHOO.util.Event.removeListener(document, updateMousePosition);
		
		if(document.getElementById('kartenOverlay'))
			document.getElementById('kartenOverlay').style.display = 'none';			
		return;
	}
	
	if(!o) o = document.getElementById('kartenOverlay');	
	if(o) {
		var fenster = findWinDim();
		var overlay = [o.offsetWidth, o.offsetHeight];
		
		if(fenster[0] + getScrollWidth() > (mouseX + 10 + overlay[0]))
			o.style.left = (mouseX + 10) + 'px';
		else
			o.style.left = (mouseX - 10 - overlay[0]) + 'px';
			
		if(fenster[1] + getScrollHeight() > (mouseY + 10 + overlay[1]))
			o.style.top = (mouseY + 10) + 'px';
		else
			o.style.top = (mouseY - 10 - overlay[1]) + 'px';
	} else {
		cardQuickInfoOn = false;
	}
}


function setupCardLinks(delay) {
	var e = YAHOO.util.Dom.getElementsByClassName('cardlink_auto', 'a');
	for(var i = 0; i < e.length; i++) {
		YAHOO.util.Dom.addClass(e[i], 'cardlink');
		YAHOO.util.Dom.removeClass(e[i], 'cardlink_auto');
		setupCardLinkEvents(e[i]);
	}
	
//	if(!delay) delay = 0;
//	window.setTimeout('setupCardLinks('+(delay+1)+')', 1000 + 1000 * delay);
}

//add listener for cardlinks
if(YAHOO.util.Event) {
	YAHOO.util.Event.addListener(window, 'load', function(e) {
		setupCardLinks();
		});	
	//listen to quickedits
	YAHOO.util.Event.addListener(window, 'click', function(e) {
		window.setTimeout('setupCardLinks()', 1000);
		}); //delay a bit
}

function setupCardLinkEvents(a) {
	a.onmouseover = function() { cardQuickInfo(this); }
	a.onmouseout = function() { cardQuickInfoHide(); }
	a.onclick = function() { cardInfo(this); return false; }
}

function findNameFromLink(a) {
	var nameRegEx = new RegExp(/(karte|card)=([^=&?]+)$/);
	var nameMatch = nameRegEx.exec(a.href);
	return nameMatch[2];
}

function deckStats(e) {
	e.parentNode.submit();
	return false;
}

function deckStatsAuto(e) {
	try {
		var link = e;
		
		//move up to fuss div
		while(e.className != 'fuss') {
			e = e.parentNode;
			if(!e) return false;
		}
			
		//move left to table
		while(e.tagName.toLowerCase() != 'table') {
			e = e.previousSibling;
			if(!e) return false;
		}
			
		//find subtables
		var tables = [];
		for(var i = 0; i < e.rows[0].cells.length; i++) {
			if(e.rows[0].cells[i].firstChild.className == 'karten')
				tables.push(e.rows[0].cells[i].firstChild);
		}
		
		var lines = '';	
		for(var j = 0; j < tables.length; j++) {
			for(var i = 0; i < tables[j].rows.length; i++) {
				if(tables[j].rows[i].cells[0].tagName.toLowerCase() == 'th') {
					var text = tables[j].rows[i].cells[0].firstChild;
					while(text && (text.nodeType != 3 || text.nodeValue.match(/^\s*$/)))
						text = text.nextSibling;
						
					if(text && text.nodeType == 3 && !text.nodeValue.match(/^\s*$/))
						lines += '//' + text.nodeValue + "\n";
						
					continue;
				}
					
				if(tables[j].rows[i].className != 'karte' 
				&& tables[j].rows[i].className != 'sideboard')
					continue;
				
				//find amount
				var td = tables[j].rows[i].cells[0];
				while(td.className != 'anzahl') {
					td = td.nextSibling;		
					if(!td) {
						continue;
					}
				}
				
				var amount = parseInt(td.innerHTML);
				
				//find name
				td = td.nextSibling;		
				if(!td) return false;
				var a = td.firstChild;
				while(!a.className.match(/(kartenlink|cardlink)/)) {
					a = a.nextSibling;		
					if(!a) {
						continue;
					}
				}
				
				var name = a.innerHTML;
				
				lines += amount + "\t" + name + "\n";
			}
		}
		
		lines = lines.replace(/\n\/\//g, "\n\n//");
		
		var form = document.createElement('form');
		form.method = 'post';
		form.target = '_blank';
		form.action = link.href;
		form.style.display = 'none';
		document.body.appendChild(form);
		
		var i = document.createElement('input');
		i.name = 'from';
		i.value = 'mtg-forum';
		form.appendChild(i);
		
		var i = document.createElement('input');
		i.name = 'smart_hybrid';
		i.value = 'on';
		form.appendChild(i);
		
		var deck = document.createElement('textarea');
		deck.name = 'deck';
		deck.value = lines;
		form.appendChild(deck);
		
		form.submit();
		document.body.removeChild(form);
		
		return false;
	} catch(ex) {
		alert(ex);
	}
}

// http://www.quirksmode.org/viewport/compatibility.html
function findWinDim() {
	var x,y;
	if (self.innerHeight) // all except Explorer
	{
		x = self.innerWidth;
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight)
		// Explorer 6 Strict Mode
	{
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}
	
	return[x, y];
}

//http://www.codehouse.com/javascript/articles/scroll_area/
function getScrollWidth()
{
 var w = window.pageXOffset ||
         document.body.scrollLeft ||
         document.documentElement.scrollLeft;
         
 return w ? w : 0;
}

function getScrollHeight()
{
 var h = window.pageYOffset ||
         document.body.scrollTop ||
         document.documentElement.scrollTop;
         
 return h ? h : 0;
}