UnitPopupButtons["ADD_FRIEND"] = { text = TEXT(ADD_FRIEND), dist = 0 };
UnitPopupButtons["ADD_IGNORE"] = { text = TEXT(IGNORE), dist = 0 };
UnitPopupButtons["WHO"] = { text = TEXT(WHO), dist = 0 };
UnitPopupButtons["ADD_GUILD"] = { text = "Guild Invite", dist = 0 };
UnitPopupButtons["GET_NAME"] = { text = "Get Name", dist = 0 };

UnitPopupMenus["FRIEND"] = { "WHISPER", "INVITE", "TARGET", "GET_NAME", "ADD_FRIEND", "ADD_IGNORE", "WHO", "ADD_GUILD", "GUILD_PROMOTE", "GUILD_LEAVE", "CANCEL" };
UnitPopupMenus["PARTY"] = { "WHISPER", "PROMOTE", "LOOT_PROMOTE", "UNINVITE", "INSPECT", "TRADE", "FOLLOW", "DUEL", "ADD_FRIEND", "WHO", "ADD_GUILD", "GET_NAME", "RAID_TARGET_ICON", "CANCEL" };
UnitPopupMenus["PLAYER"] = { "WHISPER", "INSPECT", "INVITE", "TRADE", "FOLLOW", "DUEL", "ADD_FRIEND", "ADD_IGNORE", "WHO", "ADD_GUILD", "GET_NAME", "RAID_TARGET_ICON", "CANCEL" };

function SuperPlayerLink_OnLoad()
	--hook UnitPopup_OnClick funciton
	ori_unitpopup = UnitPopup_OnClick;
	UnitPopup_OnClick = spl_unitpopup;

	--hook SetItemRef funciton
	ori_SetItemRef = SetItemRef;
	SetItemRef = spl_SetItemRef;
end

function spl_unitpopup() 
	local dropdownFrame = getglobal(UIDROPDOWNMENU_INIT_MENU);
	local button = this.value;
	local unit = dropdownFrame.unit;
	local name = dropdownFrame.name;
	local server = dropdownFrame.server;

	if ( button == "ADD_FRIEND" ) then 
		AddFriend(name);
	elseif ( button == "ADD_IGNORE" ) then 
		AddIgnore(name);
	elseif ( button == "WHO" ) then
		SendWho("n-"..name);
	elseif (button == "ADD_GUILD") then
		GuildInviteByName(name);
	elseif (button == "GET_NAME") then
		spl_GetName(name);
	else
		return ori_unitpopup();
	end
	PlaySound("UChatScrollButton");
end 

function spl_SetItemRef(link, text, button)
	if (not link) then
			link = arg1;
	end
	if (not text) then
			text = arg2;
	end
	if (not button) then
			button = arg3;
	end
	if ( strsub(link, 1, 6) == "player" ) then
		local name = strsub(link, 8);
		if ( name and (strlen(name) > 0) ) then
			name = gsub(name, "([^%s]*)%s+([^%s]*)%s+([^%s]*)", "%3");
			name = gsub(name, "([^%s]*)%s+([^%s]*)", "%2");
			if ( IsShiftKeyDown() ) then
				local staticPopup;
				staticPopup = StaticPopup_Visible("ADD_IGNORE");
				if ( staticPopup ) then
					-- If add ignore dialog is up then enter the name into the editbox
					getglobal(staticPopup.."EditBox"):SetText(name);
					return;
				end
				staticPopup = StaticPopup_Visible("ADD_FRIEND");
				if ( staticPopup ) then
					-- If add ignore dialog is up then enter the name into the editbox
					getglobal(staticPopup.."EditBox"):SetText(name);
					return;
				end
				staticPopup = StaticPopup_Visible("ADD_GUILDMEMBER");
				if ( staticPopup ) then
					-- If add ignore dialog is up then enter the name into the editbox
					getglobal(staticPopup.."EditBox"):SetText(name);
					return;
				end
				staticPopup = StaticPopup_Visible("ADD_RAIDMEMBER");
				if ( staticPopup ) then
					-- If add ignore dialog is up then enter the name into the editbox
					getglobal(staticPopup.."EditBox"):SetText(name);
					return;
				end
				if ( ChatFrameEditBox:IsVisible() ) then
					ChatFrameEditBox:Insert(name);
				else
					SendWho("n-"..name);					
				end
			elseif ( IsControlKeyDown() ) then
				TargetByName(name);
			elseif ( IsAltKeyDown() ) then
				spl_GetName(name);				
			elseif ( button == "RightButton" ) then
				FriendsFrame_ShowDropdown(name, 1);
			else
				ChatFrame_SendTell(name);
			end
		end
		return;
	end
	return ori_SetItemRef(link, text, button);
end

function spl_GetName(name)
	if ( ChatFrameEditBox:IsVisible() ) then
		ChatFrameEditBox:Insert(name);
	else
		DEFAULT_CHAT_FRAME.editBox:Hide();
		DEFAULT_CHAT_FRAME.editBox.chatType = "SAY";
		ChatEdit_UpdateHeader(DEFAULT_CHAT_FRAME.editBox);
		if (not DEFAULT_CHAT_FRAME.editBox:IsVisible()) then
			ChatFrame_OpenChat(name, DEFAULT_CHAT_FRAME);
		end
	end
end