/// <summary>
		/// Delve Info for Spells (V1.110+)
		/// </summary>
		/// <param name="clt">Client</param>
		/// <param name="id">SpellID</param>
		/// <returns></returns>
        public static string DelveSpell(GameClient clt, int id) {
            var dw = new DelveWriter();
			
			var spell = SkillBase.GetSpellByID(id);

			//if (spell != null && spellLine != null)
			{
				/*
				var spellLine = clt.Player.GetSpellLines()[lineId] as SpellLine;
				if (spellLine != null) {
					Spell spell = null;
					foreach (Spell spl in SkillBase.GetSpellList(spellLine.KeyName)) {
						if (spl.Level == level) {
							spell = spl;
							break;
						}
					}*/
				//if (spell != null) {
				// NOT GOOD SOLUTION SPELLLINE IS BETTER INCLUDED IN SPELL
				ISpellHandler spellHandler = ScriptMgr.CreateSpellHandler(clt.Player, spell,SkillBase.GetSpellLine(GlobalSpellsLines.Mob_Spells));
				if (spellHandler != null)
				{
				dw.Begin("Spell")
						.Value("Index", id)
						.Value("Name", spell.Name)
						//.Value("Function", spellHandler.FunctionName ?? "0")
						.Value("cast_timer", spell.CastTime - 2000, spell.CastTime > 2000) //minus 2 seconds (why mythic?)
						.Value("instant","1",spell.CastTime==0)
						//.Value("damage", spellHandler.GetDelveValueDamage, spellHandler.GetDelveValueDamage != 0)
						.Value("damage_type", (int) spell.DamageType + 1, (int) spell.DamageType > 0) // Damagetype not the same as dol
						//.Value("type1", spellHandler.GetDelveValueType1, spellHandler.GetDelveValueType1 > 0)
						.Value("level", spell.Level, spell.Level > 0)
						.Value("power_cost", spell.Power, spell.Power != 0)
						//.Value("round_cost",spellHandler.GetDelveValueRoundCost,spellHandler.GetDelveValueRoundCost!=0)
						//.Value("power_level", spellHandler.GetDelveValuePowerLevel,spellHandler.GetDelveValuePowerLevel!=0)
						.Value("range", spell.Range, spell.Range > 0)
						.Value("duration", spell.Duration/1000, spell.Duration > 0) //seconds
						.Value("dur_type", GetDurrationType(spell), GetDurrationType(spell) > 0)
						//.Value("parm",spellHandler.GetDelveValueParm,spellHandler.GetDelveValueParm>0) 
						.Value("timer_value", spell.RecastDelay/1000, spell.RecastDelay > 1000)
						//.Value("bonus", spellHandler.GetDelveValueBonus, spellHandler.GetDelveValueBonus > 0)
						//.Value("no_combat"," ",Util.Chance(50))//TODO
						//.Value("link",14000)
						//.Value("ability",4) // ??
						//.Value("use_timer",4)
						.Value("target", GetSpellTargetType(spell.Target), GetSpellTargetType(spell.Target) > 0)
						//.Value("frequency", spellHandler.GetDelveValueFrequency, spellHandler.GetDelveValueFrequency != 0)
						.Value("description_string", spell.Description, !string.IsNullOrEmpty(spell.Description))
						.Value("radius", spell.Radius, spell.Radius > 0)
						.Value("concentration_points", spell.Concentration, spell.Concentration > 0)
						//.Value("num_targets", spellHandler.GetDelveValueNumTargets, spellHandler.GetDelveValueNumTargets>0)
						//.Value("no_interrupt", spell.Interruptable ? (char)0 : (char)1) //Buggy?
						;
					//log.Info(dw.ToString());
					return dw.ToString();
					// }
				}
			}

        	// not found
            return dw.Begin("Spell").Value("Name", "(not found)").Value("Index", id).ToString();
        }
		/// <summary>
		/// Delve Info for Songs (V1.110+)
		/// </summary>
		/// <param name="clt">Client</param>
		/// <param name="id">SpellID</param>
		/// <returns></returns>
		public static string DelveSong(GameClient clt, int id)
		{
			var dw = new DelveWriter();

			Spell spell = SkillBase.GetSpellByID(id);
		
	
			if (spell != null)
			{
	
					dw.Begin("Song")
						.Value("Index", id)
						.Value("Name", spell.Name)
						.Value("effect", spell.ClientEffect)
						.Value("description_string", spell.Description, !string.IsNullOrEmpty(spell.Description))
						;
					//log.Info(dw.ToString());
					return dw.ToString();
			}

			// not found
			return dw.Begin("Song").Value("Name", "(not found)").Value("Index", id).ToString();
		}