function CompactRaidGroup_OnLoad(self)
	self.title:Disable();
	
	self:RegisterEvent("RAID_ROSTER_UPDATE");
	self.applyFunc = CompactRaidGroup_ApplyFunctionToAllFrames;
end

function CompactRaidGroup_OnEvent(self, event, ...)
	if InCombatLockdown() then 
		return self:RegisterEvent("PLAYER_REGEN_ENABLED"); 
	end 

	if ( event == "RAID_ROSTER_UPDATE" ) then
		CompactRaidGroup_UpdateUnits(self);
	elseif ( event == "PLAYER_REGEN_ENABLED" ) then
		CompactRaidGroup_UpdateUnits(self);
		self:UnregisterEvent("PLAYER_REGEN_ENABLED");
	end
end

function CompactRaidGroup_ApplyFunctionToAllFrames(frame, updateSpecifier, func, ...)
	if ( updateSpecifier == "normal" or updateSpecifier == "all" ) then
		for i=1, MEMBERS_PER_RAID_GROUP do
			local unitFrame = _G[frame:GetName().."Member"..i];
			func(unitFrame, ...);
		end
	elseif ( updateSpecifier == "group" ) then
		func(frame, ...);
	end
end

function CompactRaidGroup_GenerateForGroup(groupIndex)
	local didCreate = false;
	local frame = _G["CompactRaidGroup"..groupIndex]
	if ( not frame ) then
		frame = CreateFrame("Frame", "CompactRaidGroup"..groupIndex, UIParent, "CompactRaidGroupTemplate");
		CompactRaidGroup_InitializeForGroup(frame, groupIndex);
		--CompactRaidGroup_UpdateLayout(frame);	--Update border calls UpdateLayout.
		CompactRaidGroup_UpdateBorder(frame);
		didCreate = true;
	end
	return frame, didCreate;
end

function CompactRaidGroup_InitializeForGroup(frame, groupIndex)
	frame:SetID(groupIndex);
	for i=1, MEMBERS_PER_RAID_GROUP do
		local unitFrame = _G[frame:GetName().."Member"..i];
		CompactUnitFrame_SetUpFrame(unitFrame, DefaultCompactUnitFrameSetup);
		CompactUnitFrame_SetUpdateAllEvent(unitFrame, "RAID_ROSTER_UPDATE");
	end
	CompactRaidGroup_UpdateUnits(frame);
	frame.title:SetFormattedText(GROUP_NUMBER, groupIndex);
end

function CompactRaidGroup_UpdateUnits(frame)
	local groupIndex = frame:GetID();
	local frameIndex = 1;
	if ( IsInRaid() ) then
		for i=1, GetNumGroupMembers() do
			local name, rank, subgroup = GetRaidRosterInfo(i);
			if ( subgroup == groupIndex and frameIndex <= MEMBERS_PER_RAID_GROUP ) then
				CompactUnitFrame_SetUnit(_G[frame:GetName().."Member"..frameIndex], "raid"..i);
				frameIndex = frameIndex + 1;
			end
		end
		
		for i=frameIndex, MEMBERS_PER_RAID_GROUP do
			local unitFrame = _G[frame:GetName().."Member"..i];
			CompactUnitFrame_SetUnit(unitFrame, nil);
		end
	end
end

function CompactRaidGroup_UpdateLayout(frame)
	local totalHeight = frame.title:GetHeight();
	local totalWidth = 0;
	if ( CUF_HORIZONTAL_GROUPS ) then
		frame.title:ClearAllPoints();
		frame.title:SetPoint("TOPLEFT");
		
		local frame1 = _G[frame:GetName().."Member1"];
		frame1:ClearAllPoints();
		frame1:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, -frame.title:GetHeight());
		
		for i=2, MEMBERS_PER_RAID_GROUP do
			local unitFrame = _G[frame:GetName().."Member"..i];
			unitFrame:ClearAllPoints();
			unitFrame:SetPoint("LEFT", _G[frame:GetName().."Member"..(i-1)], "RIGHT", 0, 0);
		end
		totalHeight = totalHeight + _G[frame:GetName().."Member1"]:GetHeight();
		totalWidth = totalWidth + _G[frame:GetName().."Member1"]:GetWidth() * MEMBERS_PER_RAID_GROUP;
	else
		frame.title:ClearAllPoints();
		frame.title:SetPoint("TOP");
		
		local frame1 = _G[frame:GetName().."Member1"];
		frame1:ClearAllPoints();
		frame1:SetPoint("TOP", frame, "TOP", 0, -frame.title:GetHeight());
		
		for i=2, MEMBERS_PER_RAID_GROUP do
			local unitFrame = _G[frame:GetName().."Member"..i];
			unitFrame:ClearAllPoints();
			unitFrame:SetPoint("TOP", _G[frame:GetName().."Member"..(i-1)], "BOTTOM", 0, 0);
		end
		totalHeight = totalHeight + _G[frame:GetName().."Member1"]:GetHeight() * MEMBERS_PER_RAID_GROUP;
		totalWidth = totalWidth + _G[frame:GetName().."Member1"]:GetWidth();
	end
	
	if ( frame.borderFrame:IsShown() ) then
		totalWidth = totalWidth + 12;
		totalHeight = totalHeight + 4;
	end
	
	frame:SetSize(totalWidth, totalHeight);
end

function CompactRaidGroup_UpdateBorder(frame)	
	if ( CUF_SHOW_BORDER ) then
		frame.borderFrame:Show();
	else
		frame.borderFrame:Hide();
	end
	CompactRaidGroup_UpdateLayout(frame);
end

function CompactRaidGroup_StartMoving(frame)
	--Move the frame right onto the cursor.
	local cursorX, cursorY = GetCursorPosition();
	frame:ClearAllPoints();
	frame:SetPoint("TOP", UIParent, "BOTTOMLEFT", cursorX / UIParent:GetScale(), cursorY / UIParent:GetScale() + 10);
	
	frame:StartMoving();
	MOVING_COMPACT_RAID_FRAME = frame;
end

function CompactRaidGroup_StopMoving(frame)
	frame:StopMovingOrSizing();
	if ( MOVING_COMPACT_RAID_FRAME == frame ) then
		MOVING_COMPACT_RAID_FRAME = nil;
	end
end

function CompactRaidGroup_StopAllMoving()
	if ( MOVING_COMPACT_RAID_FRAME ) then
		CompactRaidGroup_StopMoving(MOVING_COMPACT_RAID_FRAME)
	end
end