var BUFFED_BROWSER    		= {};
var BUFFED_CACHE  			= {};
var BUFFED_LASTREQUEST_ID 	= null;
var BUFFED_LASTREQUEST_X  	= null;
var BUFFED_LASTREQUEST_Y	= null;
var BUFFED_BASEURL			= {deDE:"http://www.buffed.de/", ruRU:"http://www.buffed.ru/", enGB:"http://wowdata.getbuffed.com/"};

BUFFED_BROWSER.ie 			= (navigator.appName=="Microsoft Internet Explorer");
BUFFED_BROWSER.opera 		= (navigator.userAgent.search(/Opera/)!=-1);
BUFFED_BROWSER.safari 		= (navigator.userAgent.search(/Safari/)!=-1);
BUFFED_BROWSER.gecko 		= (!BUFFED_BROWSER.safari && navigator.appName=="Netscape");

function BUFFED_INIT () {
	BUFFED_ADDEVENTLISTENER(document, "mouseover", BUFFED_HANDLEMOUSEOVER);

	var h=document.getElementsByTagName("head")[0];

	if(h) {

		var l=document.createElement("link");


		l.type="text/css";
		l.href=BUFFED_BASEURL.deDE+"css/buffed-ext-tooltip-wow.css";
		l.rel="stylesheet";
		h.appendChild(l);

		if(BUFFED_BROWSER.ie) {

			l=document.createElement("link");
			l.type="text/css";
			l.href=BUFFED_BASEURL.deDE+"css/buffed-ext-tooltip-ie.css";
			l.rel="stylesheet";
			h.appendChild(l);

		}

	}
}

function BUFFED_ADDEVENTLISTENER(obj, eventType, func) {

	if(obj.addEventListener) {

		obj.addEventListener(eventType, func, false);
		return true;

	} else if(obj.attachEvent) {

		var retVal=obj.attachEvent("on"+eventType, func);
		return retVal;

	} else {

		return false;

	}

}

function BUFFED_HANDLEMOUSEOVER(e) {

	if(!e) {
		e=window.event;
	}

	var t=e.target?e.target:e.srcElement;
	
	if(!t) return;

	var count = 0;

	while(t && t.nodeName!="A" && t.nodeName!="a" && count < 4) {
		t=t.parentNode;
	}

	if(!t || (t.nodeName!="A" && t.nodeName!="a") || !t.href.length) {
		return;
	}

	if(t.rel == "nott") return;
	
	var m=t.href.match(/^http:\/\/(\w+\.)?buffed\.(de|ru|es|fr)\/?\?(i|q|s|a)=([0-9]+)/);
	if(!m) {
		m=t.href.match(/^http:\/\/(\w+\.)?getbuffed\.(com)\/?\?(i|q|s|a)=([0-9]+)/);
	}

	var type,id,domain = '',tld = '';
	if(m) {
		domain = m[1];
		tld = m[2];
		type = m[3];
		id	 = m[4];
	} else {
		var m2 = window.location.hostname.match(/^(\w+\.)?buffed\.(de|ru|es|fr)$/)
		if(!m2) {
			m2 = window.location.hostname.match(/^(\w+\.)?getbuffed\.(com)$/)
		}
		if (m2) {
			domain = m2[1];
			tld = m2[2];
			m=t.href.match(/^\/?\?(i|q|s|a)=([0-9]+)/);
			if(m) {
				type = m[1];
				id	 = m[2];
			}
		}
	}
	
	var locale='deDE';
	if(tld == 'ru') {
		locale='ruRU';
	}
	if(tld == 'com') {
		locale='enGB';
	}

	if(m) {
		if(locale == 'deDE' && (domain=='wardata.' || domain=='wardata')) {
			return;
		}
		if(t.title) {
			// Titel beißt sich mit Tooltip
			t.title = '';
		}
		if(!t.onmousemove) {

			t.onmousemove=BUFFED_TTMOUSEMOVE;
			t.onmouseout=BUFFED_TTMOUSEOUT;

		}

		BUFFED_SHOWTT(locale, type, id, e, null, null);
		return;

	}

}


function BUFFED_TTMOUSEMOVE(e){
	BUFFED_SET_TOOLTIP_POS(BUFFED_GETMOUSEPOSX(e), BUFFED_GETMOUSEPOSY(e));
}

function BUFFED_TTMOUSEOUT(){
	BUFFED_LastRequest_Type=null;
	BUFFED_LastRequest_ID=null;
	BUFFED_HIDETT();
}

function BUFFED_GETMOUSEPOSX(event) {
	if(BUFFED_BROWSER.ie) {
		return window.event.clientX;
	} else {
		return event.pageX;
	}
}

function BUFFED_GETMOUSEPOSY(event) {
	if(BUFFED_BROWSER.ie) {
		return window.event.clientY;
	} else {
		return event.pageY;
	}
}

function BUFFED_GETSCROLLX() {

	if(BUFFED_BROWSER.gecko || BUFFED_BROWSER.opera) {

		return window.pageXOffset;

	} else if(document.documentElement && document.documentElement.scrollLeft) {

		return document.documentElement.scrollLeft;

	} else if(document.body && document.body.scrollLeft) {

		return document.body.scrollLeft;

	} else {

		return 0;

	}

}

function BUFFED_GETSCROLLY() {

	if(BUFFED_BROWSER.gecko || BUFFED_BROWSER.opera) {

		return window.pageYOffset;

	} else if(document.documentElement && document.documentElement.scrollTop) {

		return document.documentElement.scrollTop;

	} else if(document.body && document.body.scrollTop) {

		return document.body.scrollTop;

	} else {

		return 0;

	}

}

function BUFFED_GETWINDOWWIDTH() {

  	if(window.innerWidth) {

	    return window.innerWidth;

  	} else if(document.documentElement && document.documentElement.clientWidth) {

    	return document.documentElement.clientWidth;

	} else if(document.body && document.body.clientWidth) {

		return document.body.clientWidth;

	} else {

    	return 0;

	}

}

function BUFFED_GETWINDOWHEIGHT() {

  	if(window.innerHeight) {

   		return window.innerHeight;

  	} else if(document.documentElement && document.documentElement.clientHeight) {

    	return document.documentElement.clientHeight;

	} else if(document.body && document.body.clientHeight) {

		return document.body.clientHeight;

  	} else {

    	return 0;

  	}

}

function BUFFED_SET_TOOLTIP_POS(xpos, ypos) {

	var BFDTTDIV=document.getElementById("BUFFED_TOOLTIP");

	if(BFDTTDIV) {

		var windowwidth=BUFFED_GETWINDOWWIDTH();
		var windowheight=BUFFED_GETWINDOWHEIGHT();
		var height=BFDTTDIV.clientHeight;
		var width=BFDTTDIV.clientWidth;
		var xoffset=-40;
		var yoffset=20;
		var xscroll=BUFFED_GETSCROLLX();
		var yscroll=BUFFED_GETSCROLLY();
		var xzero=0;
		var yzero=0;

		if((xpos+width) > (windowwidth+xscroll-5)) {
			xzero=-width+xzero;
		}

		if((xpos+xzero) < xscroll) {
			xzero=0;
		}

		if((ypos+height) > (windowheight+yscroll-20)) {
			yzero=-height-25+yzero;
		}

		if((ypos+yzero) < yscroll) {
			yzero=0;
		}

		BFDTTDIV.style.left=(xpos+xoffset+xzero+(BUFFED_BROWSER.ie?xscroll:0)+"px");
		BFDTTDIV.style.top=(ypos+yoffset+yzero+(BUFFED_BROWSER.ie?yscroll:0)+"px");
		BFDTTDIV.style.zIndex=101;

	}

}

function BUFFED_HIDETT(){

	var BUFFEDTT = document.getElementById("BUFFED_TOOLTIP");

	if(BUFFEDTT) {

		BUFFEDTT.style.visibility="hidden";

	}

}

function BUFFED_REQUEST(adr) {

	var element=document.getElementById("BUFFED_TT_REQUEST");
	var h=document.getElementsByTagName("head")[0];

	if(element != null) {
		element.parentNode.removeChild(element);
	}

	element=document.createElement("script");
	element.id="BUFFED_TT_REQUEST";
	element.type="text/javascript";
	element.src=adr;
	h.appendChild(element);

}


function BUFFED_SHOWTT(locale, type, id, e, xpos, ypos){

	if(!BUFFED_CACHE[locale]) {
		BUFFED_CACHE[locale] = [];
	}

	if(!BUFFED_CACHE[locale][type]) {
		BUFFED_CACHE[locale][type] = [];
	}

	var cache = BUFFED_CACHE[locale][type];

	if(!cache[id]) {

		if(e) {

				BUFFED_LASTREQUEST_ID=id;
				BUFFED_LASTREQUEST_X=BUFFED_GETMOUSEPOSX(e);
				BUFFED_LASTREQUEST_Y=BUFFED_GETMOUSEPOSY(e);
				if(type == "i"){
					BUFFED_REQUEST(BUFFED_BASEURL[locale]+"tooltips/items/js/"+id+".js");
				}
				if(type == "q"){
					BUFFED_REQUEST(BUFFED_BASEURL[locale]+"tooltips/quests/js/"+id+".js");
				}
				if(type == "s"){
					BUFFED_REQUEST(BUFFED_BASEURL[locale]+"tooltips/spells/js/"+id+".js");
				}
				if(type == "a"){
					BUFFED_REQUEST(BUFFED_BASEURL[locale]+"tooltips/achievements/js/"+id+".js");
				}
			}

	}else{

		if(!cache[id]) {
			return;
		}

		var tooltip=cache[id];
		var ttdiv=document.getElementById("BUFFED_TOOLTIP");

		if(!ttdiv) {

			var b=document.getElementsByTagName("body")[0];
			if(!b) {
				return;
			}

			ttdiv=document.createElement("div");
			ttdiv.id="BUFFED_TOOLTIP";
			ttdiv.style.display="none";
			ttdiv.style.visibility="hidden";
			ttdiv.innerHTML = '<div class="db-tooltip"><table><tr><td><table><tr><td id="BUFFED_TOOLTIP_DATA"></td></tr></table></td><th style="background-position: top right"></th></tr><tr><th style="background-position: bottom left"></th><th style="background-position: bottom right"></th></tr></table></div>';
			b.appendChild(ttdiv);
		}

		ttdiv.style.display="";
		ttdiv.style.visibility="hidden";

		BUFFED_SET_TOOLTIP_POS(0, 0);

		document.getElementById("BUFFED_TOOLTIP_DATA").innerHTML=tooltip;

		ttdiv.cheight=ttdiv.clientHeight;

		if(!(xpos && ypos) && e) {

			xpos=BUFFED_GETMOUSEPOSX(e);
			ypos=BUFFED_GETMOUSEPOSY(e);

		}

		BUFFED_SET_TOOLTIP_POS(xpos, ypos);
		ttdiv.style.visibility="visible";
		ttdiv.style.width="320px";


	}

}


function BUFFED_ADDTOOLTIP(data) {

	var h=document.getElementsByTagName("head")[0];

	if(!data || !data.type || !data.id) {
		return;
	}

	var locale = 'deDE';
	if(data.l) {
		locale = data.l;
	}

	if(!BUFFED_CACHE[locale]) {
		BUFFED_CACHE[locale] = [];
	}

	if(!BUFFED_CACHE[locale][data.type]) {
		BUFFED_CACHE[locale][data.type] = [];
	}

	BUFFED_CACHE[locale][data.type][data.id] = [data.tt];

	BUFFED_SHOWTT(locale, data.type, data.id, null, BUFFED_LASTREQUEST_X, BUFFED_LASTREQUEST_Y);

}


BUFFED_INIT();