jQuery(document).ready(function(){
	var armory=new Armory();
	armory.register();
});


function Armory() {
	
	this.datacache={};
	this.tt=new ArmoryToolTip();
		
	this.register=function(){
		var _this=this;
		var elem=jQuery('a[rel~=armory]');
		if (elem.length>0){
			elem.each(function(index,element){
				_this.registerElement(jQuery(element));
			});
		}
	};
	
	this.registerElement=function(element){
		var item=parseInt(element.attr('rel').split(' ')[1]);
		if (isNaN(item))
			return false;
		var _this=this;
		if (element.attr('href')=='#'){
			element.click(function(){
				return false;
			});
		}
		element.mouseenter((function(item){
			return function(){
				_this.showTooltip(item);
			}
		})(item));
		element.mouseout(function(){
			_this.tt.reset();
		});
		this.requestData(item);
	};
	
	this.showTooltip=function(item){
		var data;
		if (this.datacache[item])
			data=this.datacache[item];
		else{
//			data=this.requestData(item);
			return false;
		}
		this.tt.setName(data.name);
		this.tt.setQuality(data.overallQualityId);
		this.tt.setBond(data.bonding,data.accountBound);
		if (data.maxCount){
			this.tt.setMaxCount(data.maxCount);
		}
		if (typeof data.conjured != 'undefined')
			this.tt.setConjour(true);
		if (data.allowableClasses){
			this.tt.setClass(data.allowableClasses);
		}
		if (data.allowableRaces){
			this.tt.setRaces(data.allowableRaces);
		}
		if (data.requiredLevel && data.requiredLevel>1)
			this.tt.setLevel(data.requiredLevel);
		else if (data.requiredLevelMin){
			this.tt.setLevelRange(data.requiredLevelMin,data.requiredLevelMax,data.requiredLevelCurr);
		}
		if (data.requiredSkill){
			this.tt.setSkill(data.requiredSkill);
		}
		if (data.itemLevel)
			this.tt.setItemLevel(data.itemLevel);
		if(data.equipData){
			this.tt.setItemInfo(data.equipData);
		}
		if(data.startQuestId){
			this.tt.setQuestStart(data.startQuestId);
		}
		if (data.heroic){
			this.tt.setHeroic(data.heroic);
		}
		if (data.armor){
			this.tt.setArmor(data.armor.content);
		}
		if (data.damageData){
			this.tt.setDamageInfo(data.damageData);
		}
		if (data.durability)
			this.tt.setDurability(data.durability.current,data.durability.max);
		this.tt.setStats(data);
		if (data.gemProperties){
			this.tt.setGemProperties(data.gemProperties);
		}
		if (data.spellData)
			this.tt.setSpell(data.spellData);
		if (data.socketData)
			this.tt.setSocket(data.socketData);
		
		if (data.setData)
			this.tt.setSetData(data.setData);
		if (data.glyphType)
			this.tt.setGlyph(data.glyphType);
		this.tt.setImage(data.icon);
		if (data.desc)
			this.tt.setText(data.desc);
		this.tt.show();
	};		
	
	
	this.requestData=function(item){
		var _this=this;
		var settings={
			'url':'/wp-content/plugins/gamtags_pro/$static/items/'+item+'.txt',
			'dataType':'json',
			'async':true,
			'success':function(data){
				_this.datacache[item]=data;
//				_this.showTooltip(item);
			}
		};
		jQuery.ajax(settings);
	};
	
}

function ArmoryToolTip() {
	
	// root node
	this.node = jQuery('<div class="armorytooltip" style="position:absolute;z-index:99;color:#fff;width:315px;padding:10px;-moz-border-radius:3px;-webkit-border-radius:3px;font-size:12px;font-family:Verdana,sans-serif;line-height:17px;"></div>');
	
	// transparent bg
	this.node.append(jQuery('<div style="position:absolute;left:0;right:0;bottom:0;top:0;background-color:#000;opacity:0.85;z-index:-1;-moz-border-radius:3px;-webkit-border-radius:3px;"></div>'));
	
	
	this.name = jQuery('<div class="name" style="font-size:14px;line-height:19px;"></div>');
	
	this.text = jQuery('<div class="desc" style="color:#FFD517;"></div>');
	this.bound = jQuery('<div class="bond"></div>');
	this.maxcount=jQuery('<div class="maxcount"></div>');
	this.imageFrame=jQuery('<div style="position:absolute;top:0px;left:-74px;background-repeat:no-repeat;background-position:center center;width:68px;height:68px;"></div>');
	this.image=jQuery('<img src="" style="position:absolute;top:2px;left:2px;" />');
	this.imageFrameBorder=jQuery('<img src="/wp-content/plugins/gamtags_pro/$static/icons/64x64/frame.png" style="position:absolute;top:0px;left:0px;" />');
	this.level=jQuery('<div class="level"></div>');
	this.skill=jQuery('<div class="skill"></div>');
	this.itemLevel=jQuery('<div class="itemlevel"></div>');
	this.spellTrigger=jQuery('<div class="spelltrigger" style="color:#00FF00;"></div>');
	this.itemInfo=jQuery('<div class="iteminfo" style="clear:both;"></div>');
	this.damageInfo=jQuery('<div class="dmginfo" style="clear:both;"></div>');
	this.stats= jQuery('<div class="stats"></div>');
	this.durability=jQuery('<div class="durability"></div>');
	this.armor=jQuery('<div style="display:none;" />');
	this.socket=jQuery('<div style="display:none;" />');
	this.set=jQuery('<div style="display:none;margin-top:20px;" />');
	this.race=jQuery('<div style="display:none;" />');
	this.quest=jQuery('<div style="display:none;" />');
	this.clazz=jQuery('<div style="display:none;" />');
	this.glyph=jQuery('<div style="display:none;color:#5EA6E1;" />');
	this.heroic=jQuery('<div style="display:none;color:#00FF00;" />');
	this.conjour=jQuery('<div style="display:none;" />');
	
	this.imageFrame.append(this.image);
	this.imageFrame.append(this.imageFrameBorder);
	
	this.node.append(this.name);
	this.node.append(this.heroic);
	this.node.append(this.conjour);
	this.node.append(this.glyph);
	this.node.append(this.bound);
	this.node.append(this.maxcount);
	this.node.append(this.race);
	this.node.append(this.itemInfo);
	this.node.append(this.quest);
	this.node.append(this.damageInfo);
	this.node.append(this.armor);
	this.node.append(this.stats);
	this.node.append(this.socket);
	this.node.append(this.durability);
	this.node.append(this.clazz);
	
	this.node.append(this.level);
	this.node.append(this.skill);
	this.node.append(this.itemLevel);
	this.node.append(this.spellTrigger);
	
	this.node.append(this.text);
	this.node.append(this.set);
	this.node.append(this.imageFrame);
	
	
	
	var _this=this;
	jQuery(document).mousemove(function(e){
		_this.mouseMove(e.pageX,e.pageY);
	});
	
	this.mouseMove=function(x,y){
		this.node.css({
			'left':(x+94)+"px",
			'top':(y-5)+"px"
		});
	};
	
	this.setName=function(name){
		this.name.text(name);
	};
	
	this.setText=function(text){
		this.text.css('display','block');
		this.text.text('"'+text+'"');
	};
	this.setItemInfo=function(data){
		
		if (data.inventoryType){
			if (data.inventoryType==0)
				return;
			var type=inventoryType[data.inventoryType];
			var con=jQuery('<div style="float:left"></div>');
			con.text(type);
			this.itemInfo.append(con);
			this.itemInfo.css('display','block');
		
			if (data.subclassName){
				var clazz=data.subclassName;
				var con=jQuery('<div style="float:right;"></div>');
				con.text(clazz);
				this.itemInfo.append(con);
				this.itemInfo.css('display','block');
			}
			this.itemInfo.append(jQuery('<div style="clear:both;"></div>'));
		}
	};
	
	this.setImage=function(name){
		var url='/wp-content/plugins/gamtags_pro/$static/icons/64x64/'+name+'.jpg';
		this.image.attr('src',url);
		this.image.css('display','block');
	};
	
	this.setSkill=function(skill){
		this.skill.text('Benötigt '+skill.name+" "+skill.rank);
		this.skill.css('display','block');
	};
	
	this.setLevel=function(level){
		this.level.text('Benötigt Stufe '+level);
		this.level.css('display','block');
	};
	
	this.setLevelRange=function(min,max,cur){
		this.level.text('Benötigt Stufe '+min+" bis "+max+" ("+cur+")");
		this.level.css('display','block');
	};
	
	this.setBond=function(bnd,accBound){
		if (bnd==0)
			return;
		if (accBound)
			this.bound.text('Accountgebunden');
		else
			this.bound.text(bound[bnd]);
		this.bound.css('display','block');
	}
	
	this.setQuality=function(qual){
		if (qual=='')
			qual=0;
		var col=quality[qual];
		this.name.css({'color':col});
	};
	
	this.setMaxCount=function(cnt){
		if (cnt==0)
			return;
		this.maxcount.css('display','block');
		if (cnt instanceof Object && cnt.uniqueEquippable && cnt.uniqueEquippable==1){
			this.maxcount.text('Einzigartig anlegbar');
			return;
		}
		
		var txt='Einzigartig';
		if (cnt>1){
			txt='Limitiert ('+cnt+')';
		}
		this.maxcount.text(txt);
	};
	this.setItemLevel=function(level){
		this.itemLevel.css('display','block');
		this.itemLevel.text('Gegenstandsstufe '+level);
	};
	this.setSpell=function(data){
		for (var i in data){
			var trigger=data[i];
			var cont=jQuery('<div />');
			cont.text(spellTrigger[trigger.trigger]+": "+trigger.desc);
			this.spellTrigger.append(cont);
		}
	};
	this.setDamageInfo=function(data){
		var damage=data.damage;
		if (damage instanceof Array){
			for (var i=0;i<damage.length;i++){
				var dmg=damage[i];
				
				var cont=jQuery('<div style="clear:both"></div>');
				this.damageInfo.append(cont);
				var left=jQuery('<div style="float:left;"></div>');
				cont.append(left);
				if (dmg.type=='')
					dmg.type=0;
				var txt=dmg.min+'-'+dmg.max+' '+dmgData[dmg.type];
				
				if (i == 0){
					var right=jQuery('<div style="float:right;"></div>');
					right.text('Tempo '+data.speed);
					cont.append(right);
				}else{
					txt='+ '+txt;
				}
				left.text(txt)
				
			}
		}else{
			var cont=jQuery('<div style="clear:both"></div>');
			this.damageInfo.append(cont);
			var left=jQuery('<div style="float:left;"></div>');
			cont.append(left);
			if (damage.type=='')
				damage.type=0;
			var txt=damage.min+' - '+damage.max+' '+dmgData[damage.type];
			left.text(txt); 
			var right=jQuery('<div style="float:right;"></div>');
			right.text('Tempo '+data.speed);
			cont.append(right);
		}
		var dps=jQuery('<div style="clear:both;"></div>');
		dps.text('('+data.dps+' Schaden pro Sekunde)');
		this.damageInfo.append(dps);
		this.damageInfo.append(jQuery('<div style="clear:both;"></div>'));
		this.damageInfo.css('display','block');
	};
	this.setArmor=function(armor){
		this.armor.text(armor+' Rüstung');
		this.armor.css('display','block');
	};
	this.setSocket=function(data){
		if (data.socket instanceof Array){
			for(var i=0; i<data.socket.length; i++){
				this.insertSocket(data.socket[i]);
			}
		}else{
			this.insertSocket(data.socket);
		}
	};
	this.insertSocket=function(socket){
		var url='/wp-content/plugins/gamtags_pro/$static/icons/socket/';
		var cont=jQuery('<div style="position:relative;height:16px;" />');
		var icon=jQuery('<img src="" style="position:absolute;top:2px;left:0px;" />');
		var txtcont=jQuery('<span style="color:#787880;position:absolute;left:20px;" />');
		cont.append(icon);
		cont.append(txtcont);
		switch(socket.color){
			case 'Red':
				txtcont.text('Roter Sockel');
				url+='red.png';
				break;
			case 'Blue':
				txtcont.text('Blauer Sockel');
				url+='blue.png';
				break;
			case 'Yellow':
				txtcont.text('Gelber Sockel');
				url+='yellow.png';
				break;
			case 'Meta':
				txtcont.text('Meta Sockel');
				url+='meta.png';
				break;
		}
		icon.attr('src',url);
		this.socket.append(cont);
		this.socket.css('display','block');
		
	};
	this.setStats=function(data){
		var bon={'stats':{},'resist':{}};
		for (var key in data){
			if (key.match(/bonus|Resist/)){
				
				var cont=jQuery('<div></div>');
				if (statsData[key]){
					var type=statsData[key];
					cont.text('+'+data[key]+' '+type);
					this.stats.append(cont);
					this.stats.css('display','block');
				}else if (greenStats[key]){
					var type=greenStats[key];
					cont.text(type.replace(/%val%/,data[key]));
					this.spellTrigger.append(cont);
					this.spellTrigger.css('display','block');
				}
			}
		}
		
	};
	this.setGemProperties=function(props){
		this.stats.text(props);
		this.stats.css('display','block');
	};
	this.setDurability=function(cur,max){
		this.durability.text('Haltbarkeit: '+cur+" / "+max);
		this.durability.css('display','block');
	};
	this.setSetData=function(setdata){
		this.set.css('display','block');
		var name=jQuery('<div style="color:#ffd517;margin-bottom:10px;" />');
		var chunks=jQuery('<div style="color:#787880;margin-left:10px;" />');
		var bon=jQuery('<div style="color:#787880;margin-top:20px;" />');
		name.text(setdata.name+" (0/"+setdata.item.length+")");
		var items=setdata.item;
		for (var i=0;i<items.length;i++){
			var item=items[i];
			var itm=jQuery('<div />');
			itm.text(item.name);
			chunks.append(itm);
		}
		this.set.append(name);
		this.set.append(chunks);
		if (!setdata.setBonus)
			return;
		var boni=setdata.setBonus;
		for(var i=0;i<boni.length;i++){
			var bonus=boni[i];
			var b=jQuery('<div />');
			b.text('('+bonus.threshold+') Set: '+bonus.desc);
			bon.append(b);
			
		}
		this.set.append(bon);
	};
	this.setRaces=function(races){
		this.race.css('display','block');
		if (races.race instanceof Array)
			this.race.text('Völker: '+races.race.join(', '));
		else
			this.race.text('Völker: '+races.race);
			
	};
	this.setClass=function(clazz){
		this.clazz.css('display','block');
		if (clazz['class'] instanceof Array)
			this.clazz.text('Klassen: '+clazz['class'].join(', '));
		else
			this.clazz.text('Klassen: '+clazz['class']);
	};
	this.setQuestStart=function(query){
		this.quest.css('display','block');
		this.quest.text('Dieser Gegenstand startet eine Quest');
	};
	this.setGlyph=function(type){
		if (type=='MAJOR')
			this.glyph.text('Erhebliche Glyphe');
		else
			this.glyph.text('Geringe Glyphe');
		this.glyph.css('display','block');
	};
	this.setHeroic=function(hero){
		if (hero==1){
			this.heroic.text('Heroisch');
			this.heroic.css('display','block');
		}
	};
	this.setConjour=function(con){
		if (con){
			this.conjour.css('display','block');
			this.conjour.text('Herbeigezaubert');
		}
	};
	this.reset=function(){
		this.node.remove();
		
		this.name.text('');
		
		this.bound.css('display','none');
		this.maxcount.css('display','none');
		this.level.css('display','none');
		this.skill.css('display','none');
		this.image.css('display','none');
		this.itemLevel.css('display','none');
		this.itemInfo.css('display','none');
		this.damageInfo.css('display','none');
		this.stats.css('display','none');
		this.durability.css('display','none');
		this.armor.css('display','none');
		this.text.css('display','none');
		this.socket.css('display','none');
		this.set.css('display','none');
		this.race.css('display','none');
		this.quest.css('display','none');
		this.clazz.css('display','none');
		this.glyph.css('display','none');
		this.heroic.css('display','none');
		this.conjour.css('display','none');
		
		this.image.attr('src','#');
		this.bound.text('');
		this.maxcount.text('');
		this.level.text('');
		this.stats.html('');
		this.itemInfo.html('');
		this.skill.text('');
		this.text.text('');
		this.itemLevel.text('');
		this.spellTrigger.html('');
		this.damageInfo.html('');
		this.stats.html('');
		this.durability.text('');
		this.armor.text('');
		this.socket.html('');
		this.set.html('');
		this.race.text('');
		this.quest.text('');
		this.clazz.text('');
		this.glyph.text('');
		this.heroic.text('');
		this.conjour.text('');
	};
	
	this.show=function(){
		jQuery(document.body).append(this.node);
	};
	
	var quality = [ 
		'#9D9D9D',
		'#FFFFFF',
		'#1EFF00',
		'#0070DD',
		'#A335EE',
		'#FF8000',
		'#E5CC80',
		'#E5CC80'
	];
	
	var bound = [
	    '',
	    'Wird beim Aufheben gebunden',
	    'Wird beim Anlegen gebunden',
	    'Wird bei Benutzung gebunden',
	    'Questgegenstand'
	];
	
	var spellTrigger = {
		'':'Benutzen',
		0:'Benutzen',
		1:'Anlegen',
		2:'Trefferchance',
		6:'Benutzen'
	};
	
	var inventoryType = {
		1:'Kopf',
		2:'Hals',
		3:'Schultern',
		4:'Hemd',
		5:'Brust',
		6:'Hüfte',
		7:'Beine',
		8:'Füße',
		9:'Handgelenke',
		10:'Hände',
		11:'Finger',
		12:'Schmuck',
		13:'Einhändig',
		14:'Nebenhand',
		15:'Distanz',
		16:'Rücken',
		17:'Zweihändig',
		18:'Behälter',
		19:'Wappenrock',
		20:'Brust',
		21:'Waffenhand',
		22:'Schildhand',
		23:'In Schildhand geführt',
		24:'Projektil',
		25:'Wurfwaffe',
		26:'Distanzwaffe',
		27:'Munitionsbeutel',
		28:'Relikt'
	};
	
	
	var dmgData=[
	    'Schaden',
	    'Heiligschaden',
	    'Feuerschaden',
	    'Naturschaden',
	    'Frostschaden',
	    'Schattenschaden',
	    'Arkanschaden'
	];
	
	var statsData={
			
		'bonusStrength':'Stärke',
		'bonusAgility':'Beweglichkeit',
		'bonusStamina':'Ausdauer',
		'bonusIntellect':'Intelligenz',
		'bonusSpirit':'Willenskraft',
		
		/*
		'bonusDefenseSkillRating':'Verteidigungswertung',
		'bonusDodgeRating':'Ausweichwertung',
		'bonusParryRating':'Parierwertung',
		'bonusBlockRating':'Blockwertung',
		'bonusHitMeleeRating':'Nahkampftrefferwertung',
		'bonusHitRangedRating':'Distanztrefferwertung',
		'bonusHitSpellRating':'Zaubertrefferwertung',
		'bonusCritMeleeRating':'kritische Trefferwertung',
		'bonusCritRangedRating':'kritische Trefferwertung',
		'bonusCritSpellRating':'kritische Trefferwertung',
		'bonusHitTakenMeleeRating':'',
		'bonusHitTakenRangedRating':'',
		'bonusHitTakenSpellRating':'',
		'bonusCritTakenMeleeRating':'',
		'bonusCritTakenRangedRating':'',
		'bonusCritTakenSpellRating':'',
		'bonusHasteMeleeRating':'Tempowertung',
		'bonusHasteRangedRating':'Tempowertung',
		'bonusHasteSpellRating':'Tempowertung',
		'bonusHitRating':'Trefferwertung',
		'bonusCritRating':'kritische Trefferwertung',
		'bonusHitTakenRating':'',
		'bonusCritTakenRating':'',
		'bonusResilienceRating':'Abhärtewertung',
		'bonusHastRating':'Tempowertung',
		'bonusSpellPower':'Zaubermacht',
		'bonusAttackPower':'Angriffskraft',
		'bonusRangedAttackPower':'Distanzangriffskraft',
		'bonusFeralAttackPower':'Angriffskraft (Tiergestalt)',
		'bonusManaRegen':'Manaregeneration',
		'bonusArmorPenetration':'Rüstungsdurchschlagwertung',
		'bonusExpertiseRating':'Waffenkundewertung',
		'bonusBlockValue':'Blockwert',
		'bonusHealthRegen':'Gesundheitsregeneration',
		'bonusSpellPenetration':'Zauberdurchschlag',
		*/
		
		'fireResist':'Feuerwiderstand',
		'natureResist':'Naturwiderstand',
		'arcanResist':'Arkanwiderstand',
		'frostResist':'Frostwiderstand',
		'shadowResist':'Schattenwiderstand'
			
	};
	
	var greenStats = {
			'bonusDefenseSkillRating':'Anlegen: Erhöht die Verteidigungswertung um %val%',
			'bonusDodgeRating':'Anlegen: Erhöht Eure Ausweichwertung um %val%',
			'bonusParryRating':'Anlegen: Erhöht Eure Parierwertung um %val%',
			'bonusBlockRating':'Anlegen: Erhöht Eure Blockwertung um %val%',
			'bonusHitMeleeRating':'bonusHitMeleeRating %val%',
			'bonusHitRangedRating':'bonusHitRangedRating %val%',
			'bonusHitSpellRating':'Anlegen: Erhöht Zaubertrefferwertung um %val%',
			'bonusCritMeleeRating':'bonusCritMeleeRating %val%',
			'bonusCritRangedRating':'bonusCritRangedRating %val%',
			'bonusCritSpellRating':'Anlegen: Erhöht kritische Zaubertrefferwertung um %val%',
			'bonusHitTakenMeleeRating':'bonusHitTakenMeleeRating %val%',
			'bonusHitTakenRangedRating':'bonusHitTakenRangedRating %val%',
			'bonusHitTakenSpellRating':'bonusHitTakenSpellRating %val%',
			'bonusCritTakenMeleeRating':'bonusCritTakenMeleeRating %val%',
			'bonusCritTakenRangedRating':'bonusCritTakenRangedRating %val%',
			'bonusCritTakenSpellRating':'bonusCritTakenSpellRating %val%',
			'bonusHasteMeleeRating':'bonusHasteMeleeRating %val%',
			'bonusHasteRangedRating':'bonusHasteRangedRating %val%',
			'bonusHasteSpellRating':'Anlegen: Erhöht Zaubertempowertung um %val%',
			'bonusHitRating':'Anlegen: Erhöht Trefferwertung um %val%',
			'bonusCritRating':'Anlegen: Erhöht kritische Trefferwertung um %val%',
			'bonusHitTakenRating':'Anlegen: Erhöht Vermeidungswertung um %val%',
			'bonusCritTakenRating':'bonusCritTakenRating %val%',
			'bonusResilienceRating':'Anlegen: Erhöht Eure Abhärtungswertung um %val%',
			'bonusHastRating':'Anlegen: Erhöht Tempowertung um %val%',
			'bonusSpellPower':'Anlegen: Erhöht Zaubermacht um %val%',
			'bonusAttackPower':'Anlegen: Erhöht Eure Angriffskraft um %val%',
			'bonusRangedAttackPower':'Anlegen: Erhöht Eure Distanzangriffskraft um %val%',
			'bonusFeralAttackPower':'Anlegen: Erhöht Eure Angriffskraft in Tiergestalt um %val%',
			'bonusManaRegen':'Anlegen: Stellt alle 5 Sek. %val% Mana wieder her',
			'bonusArmorPenetration':'Anlegen: Erhöht Eure Rüstungsdurchschlagwertung um %val%',
			'bonusExpertiseRating':'Anlegen: Erhöht Eure Waffenkundewertung um %val%',
			'bonusBlockValue':'Anlegen: Erhöht den Blockwert Eures Schildes um %val%',
			'bonusHealthRegen':'Anlegen: Erhöht Eure Gesundheitsregeneration um %val%',
			'bonusSpellPenetration':'Anlegen: Erhöht Eure Zauberdurchschlagskraft um %val%'
	};
}
