local TempMaxH=0;
local bwidth=nil
local bheight=nil
local bcspace=nil
local brspace=nil
local left=nil
local right=nil
local bottom=nil
local top=nil
local hheight=nil
local hrspace=nil
local hwidth=nil
local hwidthadj=nil
local cols=nil
local nraid=nil
local tBars=nil
local b=nil
local bar=nil
local hdr=nil
local HealBot_TrackNames={};
local i=nil
local h=nil
local z=nil
local t=nil
local x=nil
local xButton=nil
local curcol=nil
local xUnit=nil
local tUnit=nil
local getUnitID=nil
local pUnit=nil
local header=nil
local order = {};
local units = {};
local HealBot_CheckedTargets={};
local name=nil
local subgroup=nil
local class=nil
local TempSort=nil
local MyGroup=0
local numHeaders = 0
local HealBot_headerno=0
local GroupValid=nil
local TargetValid=nil
local HeaderPos={}
local OffsetY = 10;
local OffsetX = 10;
local MaxOffsetY=0;
local HealBot_HeadX={};
local HealBot_HeadY={};
local HealBot_BarX={};
local HealBot_BarY={};
local HealBot_MultiColHoToffset=0;
local HealBot_TrackUnitNames={};
local HealBot_TrackButtons={};
local HealBot_TrackHButtons={};
local HealBot_TrackButtonsH={};
local HealBot_Panel_BlackList={};
local HealBot_UnitGroup={}
local format=format
local ceil=ceil;
local HealBot_AddHeight=4
local HealBot_MyHealTargets={}
local MyHealTargets=nil
local mti=0
local classEN=nil
local uName=nil

local HealBot_Action_HealGroup = {
  "player",
  "playerpet",
  "party1",
  "party2",
  "party3",
  "party4",
};

local HealBot_Action_HealButtons = {};

function HealBot_GetMyHealTargets()
	return HealBot_MyHealTargets;
end

function HealBot_Panel_SetBarArrays(bx)
  HealBot_BarX[bx]=0;
  HealBot_BarY[bx]=0;
end

function HealBot_Panel_SetHeadArrays(bx)
  HealBot_HeadX[bx]=0;
  HealBot_HeadY[bx]=0;
end

function HealBot_Panel_ClearBlackList()
  for x,_ in pairs(HealBot_Panel_BlackList) do
    HealBot_Panel_BlackList[x]=nil;
  end
end

function HealBot_Panel_AddBlackList(unitName)
  HealBot_Panel_BlackList[unitName]=true;
end

function HealBot_Panel_ClearHealTarget()
  HealBot_MyHealTargets = {}
end

function HealBot_Panel_ToggelHealTarget(unitName)
  mti=0
  table.foreach(HealBot_MyHealTargets, function (i,uName)
    if uName==unitName then
	  mti=i
	end  
  end)
  if mti>0 then
    table.remove(HealBot_MyHealTargets,mti)
	HealBot_AddDebug("Removed "..unitName.." from MyTargets")
  else
	table.insert(HealBot_MyHealTargets,unitName)
	HealBot_AddDebug("Added "..unitName.." to MyTargets")
  end
end

function HealBot_Panel_RetMyHealTarget(unitName)
  mti=0
  table.foreach(HealBot_MyHealTargets, function (i,uName)
    if uName==unitName then
	  mti=i
	end  
  end)
  if mti>0 then
    return true
  else
	return false
  end
end
  
function HealBot_Panel_SetMultiColHoToffset(nx)
  HealBot_MultiColHoToffset=nx
end

local thisX=nil

function HealBot_Action_PositionButton(button,OsetX,OsetY,bWidth,bHeight,xHeader)
  brspace=HealBot_Config.brspace[HealBot_Config.Current_Skin];
  if xHeader then
    HealBot_headerno=HealBot_headerno+1;
    hheight = ceil(bHeight*0.8)
    hrspace = ceil(brspace*1.4)+3
    hdr=getglobal("HealBot_Action_Header"..HealBot_headerno);
    bar = HealBot_Action_HealthBar(hdr);
    hwidth = bWidth*HealBot_Config.headwidth[HealBot_Config.Current_Skin]
    hwidthadj = ceil((bWidth-hwidth)/2);
	thisX=OsetX+hwidthadj+(HealBot_MultiColHoToffset*curcol)
    if HealBot_HeadX[hdr]~=thisX or HealBot_HeadY[hdr]~=format("%s",OsetY)..xHeader then
	     HealBot_HeadX[hdr]=thisX
		 HealBot_HeadY[hdr]=format("%s",OsetY)..xHeader;
         hdr:ClearAllPoints();
		 if HealBot_Config.Panel_Anchor<3 then
           hdr:SetPoint("TOPLEFT","HealBot_Action","TOPLEFT",thisX,-OsetY);
		 else
           hdr:SetPoint("TOPRIGHT","HealBot_Action","TOPRIGHT",-thisX,-OsetY);
		 end
         bar.txt = getglobal(bar:GetName().."_text");
         bar.txt:SetText(xHeader);
         hdr:Show();
    end
    HealBot_TrackButtonsH[hdr]=nil;
    HealBot_TrackHButtons[hdr]=true;
    OsetY = OsetY+hheight+hrspace;
  else
     thisX=OsetX+(HealBot_MultiColHoToffset*curcol)
     if HealBot_BarX[button]~=thisX or HealBot_BarY[button]~=OsetY then
	    HealBot_BarX[button]=thisX
		HealBot_BarY[button]=OsetY;
        button:ClearAllPoints();
        button:SetWidth(bWidth);
		if HealBot_Config.Panel_Anchor<3 then
		  button:SetPoint("TOPLEFT","HealBot_Action","TOPLEFT",thisX,-OsetY)
		else
		  button:SetPoint("TOPRIGHT","HealBot_Action","TOPRIGHT",-thisX,-OsetY)
		end
        button:Show();
	 end
     OsetY = OsetY+bHeight+brspace+HealBot_AddHeight
  end
  return OsetY;
end

function HealBot_Action_SetAddHeight()
  if HealBot_Config.bar2size[HealBot_Config.Current_Skin]==0 then
    if HealBot_Config.ShowAggroBars==0 then
	  HealBot_AddHeight=0
	else
	  HealBot_AddHeight=2
	end
  else
    if HealBot_Config.ShowAggroBars==0 then
	  HealBot_AddHeight=HealBot_Config.bar2size[HealBot_Config.Current_Skin]
	else
      HealBot_AddHeight=HealBot_Config.bar2size[HealBot_Config.Current_Skin]*2
	end
  end
end

function HealBot_Action_SetHeightWidth(width,height,bWidth)
    if HealBot_Config.Panel_Anchor==1 then
 	  if HealBot_Config.PanelAnchorY==-1 or HealBot_Config.PanelAnchorX==-1 then
	    left,top = HealBot_Action:GetLeft(),HealBot_Action:GetTop();
        HealBot_Config.PanelAnchorY=top;
        HealBot_Config.PanelAnchorX=left; 
	  end
      HealBot_Action:ClearAllPoints();
      HealBot_Action:SetPoint("TOPLEFT","UIParent","BOTTOMLEFT",HealBot_Config.PanelAnchorX,HealBot_Config.PanelAnchorY);
    elseif HealBot_Config.Panel_Anchor==2 then
	  if HealBot_Config.PanelAnchorY==-1 or HealBot_Config.PanelAnchorX==-1 then
	    left,bottom = HealBot_Action:GetLeft(),HealBot_Action:GetBottom();
		HealBot_Config.PanelAnchorY=bottom
		HealBot_Config.PanelAnchorX=left
	  end
      HealBot_Action:ClearAllPoints();
      HealBot_Action:SetPoint("BOTTOMLEFT","UIParent","BOTTOMLEFT",HealBot_Config.PanelAnchorX,HealBot_Config.PanelAnchorY);
    elseif HealBot_Config.Panel_Anchor==3 then
  	  if HealBot_Config.PanelAnchorY==-1 or HealBot_Config.PanelAnchorX==-1 then
        right,top = HealBot_Action:GetLeft(),HealBot_Action:GetBottom();
        HealBot_Config.PanelAnchorY=top;
        HealBot_Config.PanelAnchorX=right; 
	  end
      HealBot_Action:ClearAllPoints();
      HealBot_Action:SetPoint("TOPRIGHT","UIParent","BOTTOMLEFT",HealBot_Config.PanelAnchorX,HealBot_Config.PanelAnchorY);
    elseif HealBot_Config.Panel_Anchor==4 then
   	  if HealBot_Config.PanelAnchorY==-1 or HealBot_Config.PanelAnchorX==-1 then
        right,bottom = HealBot_Action:GetLeft(),HealBot_Action:GetBottom();
		HealBot_Config.PanelAnchorY=bottom;
        HealBot_Config.PanelAnchorX=right; 
	  end
      HealBot_Action:ClearAllPoints();
      HealBot_Action:SetPoint("BOTTOMRIGHT","UIParent","BOTTOMLEFT",HealBot_Config.PanelAnchorX,HealBot_Config.PanelAnchorY);
    end
  HealBot_Action:SetHeight(height);
  if (HealBot_Config.Panel_Anchor<3 and HealBot_Config.HoTposBar==2) or (HealBot_Config.Panel_Anchor>2 and HealBot_Config.HoTposBar==1) then curcol=curcol+1; end;
  HealBot_Action:SetWidth(width+bWidth+10+(HealBot_MultiColHoToffset*curcol))
end


function HealBot_Panel_PartyChanged(showHeaders)

  nraid=GetNumRaidMembers();
  MyHealTargets=nil
  numHeaders = 0
  TempMaxH=0;
  bwidth = HealBot_Config.bwidth[HealBot_Config.Current_Skin];
  bheight=HealBot_Config.bheight[HealBot_Config.Current_Skin];
  bcspace=HealBot_Config.bcspace[HealBot_Config.Current_Skin];
  cols=HealBot_Config.numcols[HealBot_Config.Current_Skin];

  for x,_ in pairs(HeaderPos) do
    HeaderPos[x]=nil;
  end
  for x,_ in pairs(HealBot_Action_HealButtons) do
    HealBot_Action_HealButtons[x]=nil;
  end
  
  for x,_ in pairs(HealBot_TrackNames) do
    HealBot_TrackNames[x]=nil;
  end
  
  for uName,_ in pairs(HealBot_Panel_BlackList) do
    HealBot_TrackNames[uName]=true
  end 
  
  table.foreach(HealBot_MyHealTargets, function (i,uName)
    HealBot_TrackNames[uName]=true
	MyHealTargets=true
  end)
  
  HealBot_TrackNames[HEALBOT_WORDS_UNKNOWN]=true
  
  HealBot_headerno=0;
    i=0;
    h=1;
    z=1;

    OffsetY = 10;
    OffsetX = 10;
    MaxOffsetY=0;
    
    if HealBot_Config.SelfHeals==1 then
        if showHeaders then 
		  HeaderPos[i+1] = HEALBOT_OPTIONS_SELFHEALS 
		  GroupValid=i
		end
        xUnit="player";
        uName=UnitName(xUnit);
	    if not HealBot_TrackNames[uName] and uName then
          i = i+1;
          HealBot_UnitName[xUnit] = uName;
		  HealBot_TrackNames[uName]=true;
          b=HealBot_Action_SetHealButton(i,xUnit,uName);
			if b then
		      HealBot_TrackButtons[b]=nil
              HealBot_TrackUnitNames[uName]=nil
              table.insert(HealBot_Action_HealButtons,b)
			end
		end
	  if showHeaders and i>GroupValid then 
	    numHeaders=numHeaders+1
		if HealBot_Config.SelfPet==1 then
			xUnit="playerpet";
			uName=UnitName(xUnit);
			if not HealBot_TrackNames[uName] and uName then
			  i = i+1;
			  HealBot_UnitName[xUnit] = uName;
			  HealBot_TrackNames[uName]=true;
			  b=HealBot_Action_SetHealButton(i,xUnit,uName);
				if b then
				  HealBot_TrackButtons[b]=nil
				  HealBot_TrackUnitNames[uName]=nil
				  table.insert(HealBot_Action_HealButtons,b)
				end
			end
		end
	  end
    end
	


    if HealBot_Config.TankHeals==1 and nraid>0 then
      if showHeaders then 
		HeaderPos[i+1] = HEALBOT_OPTIONS_TANKHEALS 
		GroupValid=i
      end
      for j=1,10 do
	    uName = HealBot_retHealBot_MainTanks(j);
		xUnit=nil
		getUnitID=true;
	    if not HealBot_TrackNames[uName] and uName then
		  if HealBot_UnitID[uName] then
            tUnit=HealBot_UnitID[uName];
			if HealBot_UnitName[tUnit]==UnitName(tUnit) then
			  xUnit=tUnit
			  getUnitID=false;
			end
		  end
		  if getUnitID then
		    for k=1,nraid do
	          tUnit = "raid"..k;
			  if uName==UnitName(tUnit) then
			    xUnit=tUnit;
				do break end;
			  end
			end
		  end
          if uName and xUnit then
            i = i+1;
            HealBot_UnitName[xUnit] = uName;
			HealBot_TrackNames[uName]=true;
            b=HealBot_Action_SetHealButton(i,xUnit,uName);
			if b then
		      HealBot_TrackButtons[b]=nil
              HealBot_TrackUnitNames[uName]=nil
              table.insert(HealBot_Action_HealButtons,b)
			end
          end
        end
      end
	  if showHeaders and i>GroupValid then numHeaders=numHeaders+1 end
    end
    
	MyGroup=0
    if HealBot_Config.GroupHeals==1 then
      if showHeaders then 
	    MyGroup=i+1
		HeaderPos[MyGroup] = HEALBOT_OPTIONS_GROUPHEALS 
		GroupValid=i
      end
      for _,xUnit in ipairs(HealBot_Action_HealGroup) do
	    if xUnit~="playerpet" or HealBot_Config.SelfPet==1 then
          uName=UnitName(xUnit);
	      if uName and not HealBot_TrackNames[uName] then
            if nraid>0 and uName~=HealBot_PlayerName then 
	          HealBot_UnitName[xUnit] = nil
	          xUnit=HealBot_RaidUnit(xUnit,uName) 
            end
            i = i+1;
            HealBot_UnitName[xUnit] = uName;
            HealBot_TrackNames[uName]=true;
            b=HealBot_Action_SetHealButton(i,xUnit,uName);
		    if b then
		      HealBot_TrackButtons[b]=nil
              HealBot_TrackUnitNames[uName]=nil
              table.insert(HealBot_Action_HealButtons,b)
            end
          end
		end
	  end
	  if showHeaders and i>GroupValid then 
	    numHeaders=numHeaders+1 
	  else
	    MyGroup=0
	  end
    end
	
    if MyHealTargets then
      if showHeaders then 
		HeaderPos[i+1] = HEALBOT_OPTIONS_MYTARGET 
		GroupValid=i
      end
      table.foreach(HealBot_MyHealTargets, function (index,uName)
--		HealBot_AddDebug("In MyHealTargets - uName="..uName)
        xUnit=HealBot_RaidUnit("unknown",uName) 
        if UnitName(xUnit) then
          i = i+1;
          HealBot_UnitName[xUnit] = uName;
          b=HealBot_Action_SetHealButton(i,xUnit,uName);
		  if b then
		    HealBot_TrackButtons[b]=nil
            HealBot_TrackUnitNames[uName]=nil
            table.insert(HealBot_Action_HealButtons,b)
          end
        end
	  end)
	  if showHeaders and i>GroupValid then numHeaders=numHeaders+1 end
    end

    if HealBot_Config.EmergencyHeals==1 then
	  for x,_ in pairs(order) do
        order[x]=nil;
      end
      for x,_ in pairs(units) do
        units[x]=nil;
      end
      if showHeaders then
	    GroupValid=i
		if HealBot_Config.ExtraOrder==1 then
          HeaderPos[i+1] = HEALBOT_OPTIONS_EMERGENCYHEALS
          numHeaders=numHeaders+1;
        end
      end
      if HealBot_Config.EmergIncMonitor==1 then
        if nraid>0 then
          for j=1,nraid do
            xUnit = "raid"..j;
            uName=UnitName(xUnit);
            if uName==HealBot_PlayerName then
			  xUnit="player"
			  if MyGroup>0 then
			    name, _, subgroup, _, class, _, _, _, _ = GetRaidRosterInfo(j);
                HeaderPos[MyGroup] = HEALBOT_OPTIONS_GROUPHEALS.." "..subgroup;
			  end
            end
            if uName and not HealBot_TrackNames[uName] then
              name, _, subgroup, _, class, _, _, _, _ = GetRaidRosterInfo(j);
              if HealBot_Config.ExtraIncGroup[subgroup] and class then
                  if HealBot_Config.ExtraOrder==1 then
                    order[xUnit] = name;
                  elseif HealBot_Config.ExtraOrder==2 then
                    order[xUnit] = class;
                  elseif HealBot_Config.ExtraOrder==3 then
                    order[xUnit] = subgroup;
                  else
                    order[xUnit] = 0-UnitHealthMax(xUnit);
                    if UnitHealthMax(xUnit)>TempMaxH then TempMaxH=UnitHealthMax(xUnit); end
                  end
                  table.insert(units,xUnit);
                  HealBot_UnitGroup[xUnit]=subgroup
                  HealBot_UnitName[xUnit] = uName;
				  HealBot_TrackNames[uName]=true;
              end
            end
          end
        elseif HealBot_Config.GroupHeals==0 then
          for _,xUnit in ipairs(HealBot_Action_HealGroup) do
            uName=UnitName(xUnit);
            if uName and not HealBot_TrackNames[uName] then
              class,_=UnitClass(xUnit)
              subgroup = 1;
              name = uName;
            
              if HealBot_Config.ExtraIncGroup[subgroup] and class then
                  if HealBot_Config.ExtraOrder==1 then
                    order[xUnit] = name;
                  elseif HealBot_Config.ExtraOrder==2 then
                    order[xUnit] = class;
                  elseif HealBot_Config.ExtraOrder==3 then
                    order[xUnit] = subgroup;
                  else
                    order[xUnit] = 0-UnitHealthMax(xUnit);
                    if UnitHealthMax(xUnit)>TempMaxH then TempMaxH=UnitHealthMax(xUnit); end
                  end
                  table.insert(units,xUnit);
                  HealBot_UnitGroup[xUnit]=subgroup
                  HealBot_UnitName[xUnit] = uName;
  				  HealBot_TrackNames[uName]=true;
              end
            end
          end
        end
      else
        if nraid>0 then
          for j=1,nraid do
 
            xUnit = "raid"..j;
            uName=UnitName(xUnit);
            if uName==HealBot_PlayerName then
			  xUnit="player"
			  if MyGroup>0 then
			    name, _, subgroup, _, class, _, _, _, _ = GetRaidRosterInfo(j);
                HeaderPos[MyGroup] = HEALBOT_OPTIONS_GROUPHEALS.." "..subgroup;
			  end
            end
			if uName and not HealBot_TrackNames[uName] then
              name, _, subgroup, _, class, _, _, _, _ = GetRaidRosterInfo(j);
			  _,classEN=UnitClass(xUnit)
              if HealBot_Config.ExtraIncGroup[subgroup] and class and HealBot_EmergInc[strsub(classEN,1,4)]==1 then
                  if HealBot_Config.ExtraOrder==1 then
                    order[xUnit] = name;
                  elseif HealBot_Config.ExtraOrder==2 then
                    order[xUnit] = class;
                  elseif HealBot_Config.ExtraOrder==3 then
                    order[xUnit] = subgroup;
                  else
                    order[xUnit] = 0-UnitHealthMax(xUnit);
                    if UnitHealthMax(xUnit)>TempMaxH then TempMaxH=UnitHealthMax(xUnit); end
                  end
                  table.insert(units,xUnit);
				  HealBot_UnitGroup[xUnit]=subgroup
                  HealBot_UnitName[xUnit] = uName;
  				  HealBot_TrackNames[uName]=true;
              end
            end
          end
        elseif HealBot_Config.GroupHeals==0 then
          for _,xUnit in ipairs(HealBot_Action_HealGroup) do
            class,classEN = UnitClass(xUnit);
            uName=UnitName(xUnit);
            if uName and class and not HealBot_TrackNames[uName] then
              name = uName;
              subgroup = 1;
              
              if HealBot_Config.ExtraIncGroup[subgroup] and HealBot_EmergInc[strsub(classEN,1,4)]==1 then
                  if HealBot_Config.ExtraOrder==1 then
                    order[xUnit] = name;
                  elseif HealBot_Config.ExtraOrder==2 then
                    order[xUnit] = class;
                  elseif HealBot_Config.ExtraOrder==3 then
                    order[xUnit] = subgroup;
                  else
                    order[xUnit] = 0-UnitHealthMax(xUnit);
                    if UnitHealthMax(xUnit)>TempMaxH then TempMaxH=UnitHealthMax(xUnit); end
                  end
                  table.insert(units,xUnit);
				  HealBot_UnitGroup[xUnit]=subgroup
                  HealBot_UnitName[xUnit] = uName;
				  HealBot_TrackNames[uName]=true;
              end
            end
          end
        end
      end
      table.sort(units,function (a,b)
        if order[a]<order[b] then return true end
        if order[a]>order[b] then return false end
        return a<b
      end)
      TempMaxH=ceil(TempMaxH/1000)*1000;
	  TempSort="init"

		for j=1,40 do
          if not units[j] then break end
          xUnit=units[j];
          uName = HealBot_UnitName[xUnit];
		  if showHeaders then
            if HealBot_Config.ExtraOrder==2 and TempSort~=UnitClass(xUnit) then 
              TempSort=UnitClass(xUnit)
              HeaderPos[i+1] = UnitClass(xUnit)
              numHeaders=numHeaders+1;
            end
            if HealBot_Config.ExtraOrder==3 and TempSort~=HealBot_UnitGroup[xUnit] then
              TempSort=HealBot_UnitGroup[xUnit]
              HeaderPos[i+1] = HEALBOT_OPTIONS_GROUPHEALS.." "..TempSort
              numHeaders=numHeaders+1;
            end
            if HealBot_Config.ExtraOrder==4 and TempMaxH>UnitHealthMax(xUnit) then
              TempMaxH=TempMaxH-1000
              HeaderPos[i+1] = ">"..format("%s",(TempMaxH/1000)).."k"
              numHeaders=numHeaders+1;
            end
		  end
          i = i+1;
          b=HealBot_Action_SetHealButton(i,xUnit,uName);
	      if b then
		      HealBot_TrackButtons[b]=nil
              HealBot_TrackUnitNames[uName]=nil
              table.insert(HealBot_Action_HealButtons,b)
		  end
        end
      if showHeaders and i==GroupValid+1 then HeaderPos[i+1] = nil end
    end
    
    if HealBot_Config.PetHeals==1 then
      for x,_ in pairs(HealBot_CheckedTargets) do
        HealBot_CheckedTargets[x]=nil;
      end
      if showHeaders then 
		HeaderPos[i+1] = HEALBOT_OPTIONS_PETHEALS 
		GroupValid=i
      end
      HealBot_CheckedTargets[HEALBOT_WORDS_UNKNOWN]=true;
      xUnit="pet"
      pUnit="player"
      uName=UnitName(xUnit);
      if not HealBot_TrackNames[uName] and not HealBot_CheckedTargets[uName] and uName then
        i = i+1;
        HealBot_UnitName[xUnit] = uName;
        b=HealBot_Action_SetHealButton(i,xUnit,uName);
	    if b then
		  HealBot_TrackButtons[b]=nil
          HealBot_TrackUnitNames[uName]=nil
          table.insert(HealBot_Action_HealButtons,b)
		end
        HealBot_CheckedTargets[uName]=true;
      end
      if nraid>0 then
        for j=1,40 do
          xUnit="raidpet"..j;
          pUnit="raid"..j;
          uName=UnitName(xUnit);
          if not HealBot_TrackNames[uName] and not HealBot_CheckedTargets[uName] and HealBot_TrackNames[UnitName(pUnit)] and uName then
            i = i+1;
            HealBot_UnitName[xUnit] = uName;
            b=HealBot_Action_SetHealButton(i,xUnit,uName);
			if b then
		      HealBot_TrackButtons[b]=nil
              HealBot_TrackUnitNames[uName]=nil
		      table.insert(HealBot_Action_HealButtons,b)
			else
			  i=i-1
			end
            HealBot_CheckedTargets[uName]=true;
          end
          if i>56 then break end
        end
      else
        for j=1,4 do
          xUnit="partypet"..j;
          pUnit="party"..j;
          uName=UnitName(xUnit);
          if not HealBot_TrackNames[uName] and not HealBot_CheckedTargets[uName] and HealBot_TrackNames[UnitName(pUnit)] and uName then
            i = i+1;
            HealBot_UnitName[xUnit] = uName;
            b=HealBot_Action_SetHealButton(i,xUnit,uName);
			if b then
		      HealBot_TrackButtons[b]=nil
              HealBot_TrackUnitNames[uName]=nil
              table.insert(HealBot_Action_HealButtons,b)
			else
			  i=i-1
			end
            HealBot_CheckedTargets[uName]=true;
          end
        end
      end
	  if showHeaders and i>GroupValid then numHeaders=numHeaders+1 end
    end
    
    if HealBot_Config.TargetHeals==1 and not HealBot_IsFighting then
	  if (UnitIsFriend("player","target")) then
	    uName=UnitName("target")
		TargetValid=false
		if uName==HealBot_PlayerName then 
		  if HealBot_Config.TargetIncSelf==1 then TargetValid=true end
		elseif UnitInParty("target") then
		  if HealBot_Config.TargetIncGroup==1 then TargetValid=true end
		elseif UnitInRaid("target") then 
		  if HealBot_Config.TargetIncRaid==1 then TargetValid=true end
		elseif UnitPlayerOrPetInParty("target") or UnitPlayerOrPetInRaid("target") then
		  if HealBot_Config.TargetIncPet==1 then TargetValid=true end
		else
		  TargetValid=true
		end
	    if TargetValid and not HealBot_Panel_BlackList[uName] then

          if showHeaders then HeaderPos[i+1] = HEALBOT_OPTIONS_TARGETHEALS end
          xUnit="target";
          if HealBot_MayHeal(xUnit, uName) then
            HealBot_UnitName["target"] = uName;	
	        b=HealBot_Action_SetTargetHealButton(xUnit,uName);
		    if b then
		      HealBot_TrackButtons[b]=nil
              HealBot_TrackUnitNames["target"]=nil
              table.insert(HealBot_Action_HealButtons,b)
			  if showHeaders then numHeaders=numHeaders+1 end
            end
          end
		end
      end
    end
	
  for uName,_ in pairs(HealBot_TrackUnitNames) do
    HealBot_TrackUnitNames[uName]=nil
	HealBot_Action_RemoveMember(uName)
  end
  
  i=0
  if HealBot_Config.Panel_Anchor<3 then
    curcol=2-HealBot_Config.HoTposBar
  else
    curcol=2-(3-HealBot_Config.HoTposBar)
  end
  z=1;
  OffsetY = 10;
  OffsetX = 10;
  MaxOffsetY=0;
  
  if showHeaders then 
    h=0
    table.foreach(HealBot_Action_HealButtons, function (x,xButton)
      uName=HealBot_UnitName[xButton.unit];
      if uName then
	    i=i+1
        if HeaderPos[i] then
          h=h+1;
          header=HeaderPos[i];
          if h>cols then
            if MaxOffsetY<OffsetY then MaxOffsetY = OffsetY; end
            OffsetY = 10;
            OffsetX = OffsetX + bwidth+bcspace; 
            h=1;
            curcol=curcol+1
          end
          OffsetY = HealBot_Action_PositionButton(nil,OffsetX,OffsetY,bwidth,bheight,header,curcol);
        end
        OffsetY = HealBot_Action_PositionButton(xButton,OffsetX,OffsetY,bwidth,bheight,nil,curcol);
      end
    end)
  else
    h=1
	tBars=table.getn(HealBot_Action_HealButtons)
    table.foreach(HealBot_Action_HealButtons, function (x,xButton)
      uName=HealBot_UnitName[xButton.unit];
      if uName then
	    i=i+1
		OffsetY = HealBot_Action_PositionButton(xButton,OffsetX,OffsetY,bwidth,bheight,nil,curcol)
        if h==ceil((tBars)/cols) and z<tBars then
          h=0;
          if MaxOffsetY<OffsetY then MaxOffsetY = OffsetY; end
          OffsetY = 10;
          OffsetX = OffsetX + bwidth+bcspace; 
          curcol=curcol+1;
        end
		
        z=z+1
        h=h+1;
	  end
	end)
  end

  for xButton,_ in pairs(HealBot_TrackButtonsH) do
    xButton:Hide();
	HealBot_HeadY[xButton]="0"
    HealBot_TrackButtonsH[xButton]=nil;
  end
  for xButton,_ in pairs(HealBot_TrackButtons) do
    xButton:Hide();
	HealBot_Panel_SetBarArrays(xButton)
    HealBot_TrackButtons[xButton]=nil;
  end
  for xUnit,xButton in pairs(HealBot_Unit_Button) do
    if UnitName(xUnit) then
      HealBot_TrackButtons[xButton]=true;
      HealBot_TrackUnitNames[UnitName(xUnit)]=true;
      if HealBot_HoT_Active_Button[UnitName(xUnit)] then
        if HealBot_HoT_Active_Button[UnitName(xUnit)]~=xButton then
          HealBot_HoT_MoveIcon(HealBot_HoT_Active_Button[UnitName(xUnit)], xButton, UnitName(xUnit))
          HealBot_HoT_Active_Button[UnitName(xUnit)]=xButton       
        end
      end
	else
	  HealBot_Unit_Button[xUnit]=nil
	end
  end
  
  for xButton,_ in pairs(HealBot_TrackHButtons) do
    HealBot_TrackButtonsH[xButton]=true;
  end

  if MaxOffsetY<OffsetY then MaxOffsetY = OffsetY; end

  if HealBot_Config.HideOptions==1 then
    HealBot_Action_OptionsButton:Hide();
  else
    HealBot_Action_OptionsButton:SetPoint("BOTTOM","HealBot_Action","BOTTOM",0,10);
    HealBot_Action_OptionsButton:Show();
    MaxOffsetY = MaxOffsetY+30;
  end  

  HealBot_Action_SetHeightWidth(OffsetX, MaxOffsetY+10, bwidth,curcol);
  HealBot_Action_RefreshButtons();
  
end

function HealBot_Action_RemoveMember(unitName)
	HealBot_ClearHealsIn(unitName)
	HealBot_Action_ClearHealsIn(unitName)
end

