vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- MetaMap
-- Written by MetaHawk - aka Urshurak

METAMAP_TITLE = "MetaMap";
METAMAP_TOC = 11200;
METAMAP_VERSION = METAMAP_TOC.."-"..2;

METAMAP_NAME = METAMAP_TITLE.."  v"..METAMAP_VERSION;
METAMAPFWM_NAME = "MetaMapPOI";
METAMAP_ICON = "Interface\\WorldMap\\WorldMap-Icon";
METAMAP_MAP_PATH = "Interface\\AddOns\\MetaMap\\Maps\\";
METAMAP_ICON_PATH = "Interface\\AddOns\\MetaMap\\Icons\\";
METAMAP_IMAGE_PATH = "Interface\\AddOns\\MetaMap\\Images\\"
METAMAP_SHADER_PATH = "Interface\\AddOns\\MetaMap\\Shaders\\"
METAMAP_MAPCREDITS = "Maps created by Niflheim";
TITAN_METAMAP_ID = METAMAP_TITLE;
TITAN_METAMAP_FREQUENCY = 1;

METAMAPMENU_BUTTON_HEIGHT = 16;
METAMAPLIST_SCROLL_FRAME_BUTTON_HEIGHT = 20;
METAMAPLIST_SCROLL_FRAME_BUTTONS_SHOWN = 30;
METAMAP_SORTBY_NAME = "name";
METAMAP_SORTBY_DESC = "desc";
METAMAP_SORTBY_LEVEL = "level";
METAMAP_SORTBY_LOCATION = "location";

MetaMap_Details = {
        name = METAMAP_TITLE,
        description = METAMAP_DESC,
        version = METAMAP_VERSION,
        releaseDate = "November 26, 2005",
        author = "MetaHawk",
        email = "admin@metaserve.org.uk",
        website = "",
        category = MYADDONS_CATEGORY_MAP,
}

MetaMapOptions = {};
MetaMap_ZoneNames = {};
MetaMap_ZoneNames[0] = {};
MetaMap_ZoneNames[1] = {};
MetaMap_ZoneNames[2] = {};
MetaMap_NoteList = {};
MetaMap_NoteFilter = {};

MetaMapNotes_MiniNote_Data = {};
MetaMapNotes_PartyNoteData = {};
MetaMapNotes_Relocate = {};
MetaMapNotes_LastLineClick = {};

MetaMap_CurrentMap = 0;
MetaMap_ListOffset = 0;
MetaMap_VarsLoaded = false;
MetaMap_FilterName = "";
MetaMap_PingTime = 15;
MetaMap_FullScreenMode = false;
MetaMapContainer_CurrentFrame = nil;
MetaMap_CurrentSaveSet = 1;
MetaMap_sortDone = true;
MetaMap_sortType = METAMAP_SORTBY_NAME;

MetaMapNotes_LastNote = 0;
MetaMapNotes_LastLine = 0;
MetaMapNotes_TempData_Id = "";
MetaMapNotes_TempData_Name = "";
MetaMapNotes_TempData_Creator = "";
MetaMapNotes_TempData_xPos = "";
MetaMapNotes_TempData_yPos = "";
MetaMapNotes_TempData_Icon = "";
MetaMapNotes_TempData_TextColor = "";
MetaMapNotes_TempData_Info1Color = "";
MetaMapNotes_TempData_Info2Color = "";
MetaMapNotes_TempData_LootID = nil;
MetaMapNotes_SetNextAsMiniNote = 0;
MetaMapNotes_LastLineClick.time = 0;
MetaMapNotes_Qnote = false;
MetaMapNotes_MiniNote_IsInCity = false;
MetaMapNotes_MiniNote_MapzoomInit = false;
MetaMapNotes_vnote_xPos = nil;
MetaMapNotes_vnote_yPos = nil;
MetaMapNotes_PartyNoteSet = false;

local MetaMapNotes_Mininote_UpdateRate = 0;
local MetaMap_OrigWorldMapButton_OnClick;
local MetaMap_OrigChatFrame_OnEvent;

METAMAPMENU_LIST = {
        {name = METAMAP_OPTIONS_COORDS},
        {name = METAMAP_OPTIONS_MINICOORDS},
        {name = METAMAP_OPTIONS_SHOWNOTES},
        {name = METAMAP_ACTION_MODE},
        {name = METAMAP_OPTIONS_SAVESET},
        {name = METAMAP_OPTIONS_SHADESET},
        {name = "Spacer"},
        {name = METAMAP_OPTIONS_EXT},
        {name = METAMAP_FLIGHTMAP_OPTIONS},
        {name = METAMAP_GATHERER_OPTIONS},
        {name = METAMAP_BWP_OPTIONS},
        {name = METAMAP_OPTIONS_USEMAPMOD},
        {name = METAMAP_KB_TEXT},
        {name = METAMAP_OPTIONS_FWM}
};

function MetaMap_SetVars()
        if(MetaMapOptions.SaveSet == nil) then MetaMapOptions.SaveSet = 1; end
        if(MetaMapOptions.MetaMapAlpha1 == nil) then MetaMapOptions.MetaMapAlpha1 = 1.0; end
        if(MetaMapOptions.MetaMapAlpha2 == nil) then MetaMapOptions.MetaMapAlpha2 = 0.60; end
        if(MetaMapOptions.BDshader1 == nil) then MetaMapOptions.BDshader1 = 0.0; end
        if(MetaMapOptions.BDshader2 == nil) then MetaMapOptions.BDshader2 = 0.0; end
        if(MetaMapOptions.MetaMapScale1 == nil) then MetaMapOptions.MetaMapScale1 = 0.75; end
        if(MetaMapOptions.MetaMapScale2 == nil) then MetaMapOptions.MetaMapScale2 = 0.55; end
        if(MetaMapOptions.MetaMapTTScale1 == nil) then MetaMapOptions.MetaMapTTScale1 = 1.0; end
        if(MetaMapOptions.MetaMapTTScale2 == nil) then MetaMapOptions.MetaMapTTScale2 = 0.75; end
        if(MetaMapOptions.MetaMapCoords == nil) then MetaMapOptions.MetaMapCoords = true; end
        if(MetaMapOptions.MetaMapMiniCoords == nil) then MetaMapOptions.MetaMapMiniCoords = true; end
        if(MetaMapOptions.MetaMapButtonShown == nil) then MetaMapOptions.MetaMapButtonShown = true; end
        if(MetaMapOptions.MetaMapButtonPosition == nil) then MetaMapOptions.MetaMapButtonPosition = 220; end
        if(MetaMapOptions.TooltipWrap == nil) then MetaMapOptions.TooltipWrap = true; end
        if(MetaMapOptions.MetaMapShowAuthor == nil) then MetaMapOptions.MetaMapShowAuthor = true; end
        if(MetaMapOptions.MenuMode == nil) then MetaMapOptions.MenuMode = false; end
        if(MetaMapOptions.UseMapMod == nil) then MetaMapOptions.UseMapMod = false; end
        if(MetaMapOptions.ShowMapList == nil) then MetaMapOptions.ShowMapList = false; end
        if(MetaMapOptions.ActionMode1 == nil) then MetaMapOptions.ActionMode = false; end
        if(MetaMapOptions.ActionMode2 == nil) then MetaMapOptions.ActionMode = false; end
        if(MetaMapOptions.LastHighlight == nil) then MetaMapOptions.LastHighlight = true; end
        if(MetaMapOptions.LastMiniHighlight == nil) then MetaMapOptions.LastMiniHighlight = true; end
        if(MetaMapOptions.AcceptIncoming == nil) then MetaMapOptions.AcceptIncoming = true; end
        if(MetaMapOptions.MiniParty == nil) then MetaMapOptions.MiniParty = true; end
        if(MetaMapOptions.ListColors == nil) then MetaMapOptions.ListColors = true; end
        if(MetaMapOptions.ShadeSet == nil) then MetaMapOptions.ShadeSet = 1; end
        if(MetaMapOptions.MiniColor == nil) then MetaMapOptions.MiniColor = 4; end
        if(MetaMapOptions.MetaMapZone == nil) then MetaMapOptions.MetaMapZone = 1; end
        if(MetaMapOptions.ZoneHeader == nil) then MetaMapOptions.ZoneHeader = false; end
        if(MetaMapOptions.ZoneShiftVersion == nil) then MetaMapOptions.ZoneShiftVersion = 0; end
        if(MetaMapOptions.usePOI == nil) then MetaMapOptions.usePOI = false; end
        if(MetaMapOptions.FWMretain == nil) then MetaMapOptions.FWMretain = false; end
        if(MetaMapOptions.BWPalwaysOn == nil) then MetaMapOptions.BWPalwaysOn = false; end
        if(MetaMapOptions.WKBalwaysOn == nil) then MetaMapOptions.WKBalwaysOn = false; end
        if(MetaMapOptions.SortList == nil) then MetaMapOptions.SortList = false; end
        for i=0, 9, 1 do
                if(MetaMap_NoteFilter[i] == nil) then MetaMap_NoteFilter[i] = true; end
        end
end

function MetaMap_SetWorldMap()
        BlackoutWorld:Hide();
        WorldMapZoomOutButton:Hide();
        WorldMapFrame:SetMovable(true);
        WorldMapMagnifyingGlassButton:Hide();
        WMF_OldScript = WorldMapFrame:GetScript("OnKeyDown")
        WorldMapFrame:SetScript("OnKeyDown", nil);
        UIPanelWindows["WorldMapFrame"] =       { area = "center",      pushable = 0 };
        SetMapToCurrentZone();
end

function MetaMapTopFrame_OnLoad()
        math.randomseed(GetTime());
        this:RegisterEvent("ADDON_LOADED");
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("WORLD_MAP_UPDATE");
        this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
        if (IsAddOnLoaded("FuBar")) then
                MetaMap_FuBar_OnLoad();
        end
end

function MetaMapFrameDropDown_OnLoad()
        UIDropDownMenu_ClearAll(MetaMapFrameDropDown);
        UIDropDownMenu_Initialize(MetaMapFrameDropDown, MetaMapFrameDropDown_Initialize);
        UIDropDownMenu_SetWidth(175);
end

function MetaMapList_OnLoad()
        this:SetFrameLevel(WorldMapButton:GetFrameLevel()+1);
        this:SetHeight(WorldMapButton:GetHeight());
        this:SetBackdropColor(0,0,0,0.65);
end

function MetaMapContainerFrame_OnLoad()
        this:SetWidth(WorldMapButton:GetWidth() - MetaMap_MapListFrame:GetWidth()-1);
        this:SetHeight(WorldMapButton:GetHeight()-41);
end

function MetaMapNotes_OnLoad()
        MiniNotePOI.TimeSinceLastUpdate = 0;
        SlashCmdList["MAPNOTE"] = MetaMapNotes_GetNoteBySlashCommand;
        for i = 1, table.getn(METAMAPNOTES_ENABLE_COMMANDS) do
                setglobal("SLASH_MAPNOTE"..i, METAMAPNOTES_ENABLE_COMMANDS[i]);
        end
        SlashCmdList["MININOTE"] = MetaMapNotes_NextMiniNote;
        for i = 1, table.getn(METAMAPNOTES_MININOTE_COMMANDS) do
                setglobal("SLASH_MININOTE"..i, METAMAPNOTES_MININOTE_COMMANDS[i]);
        end
        SlashCmdList["MININOTEONLY"] = MetaMapNotes_NextMiniNoteOnly;
        for i = 1, table.getn(METAMAPNOTES_MININOTEONLY_COMMANDS) do
                setglobal("SLASH_MININOTEONLY"..i, METAMAPNOTES_MININOTEONLY_COMMANDS[i]);
        end
        SlashCmdList["MININOTEOFF"] = MetaMapNotes_ClearMiniNote;
        for i = 1, table.getn(METAMAPNOTES_MININOTEOFF_COMMANDS) do
                setglobal("SLASH_MININOTEOFF"..i, METAMAPNOTES_MININOTEOFF_COMMANDS[i]);
        end
        SlashCmdList["QUICKNOTE"] = MetaMapNotes_Quicknote;
        for i = 1, table.getn(METAMAPNOTES_QUICKNOTE_COMMANDS) do
                setglobal("SLASH_QUICKNOTE"..i, METAMAPNOTES_QUICKNOTE_COMMANDS[i]);
        end
end

function MetaMapTopFrame_OnShow()
        if(not MetaMap_VarsLoaded) then return; end
        MetaMap_CurrentMap = GetCurrentMapZone();
        StaticPopup1:SetFrameStrata("FULLSCREEN");
        if(MetaMap_FullScreenMode) then
                MetaMapNotesEditFrame:SetParent("WorldMapFrame");
                MetaMapNotesSendFrame:SetParent("WorldMapFrame");
        end
        local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
        if(zone == 0) then return; end
        local pX, pY = GetPlayerMapPosition("Player");
        if(pX == 0 and pY == 0 and continent == 0) then
                MetaMapOptions.MetaMapZone = zone;
                MetaMap_Toggle(true)
        end
end

function MetaMapTopFrame_OnHide()
        SetMapToCurrentZone();
        MetaMapNotes_HideAll()
        MetaMap_Toggle(false);
        MetaMapOptions.SaveSet = MetaMap_CurrentSaveSet;
        MetaMapContainerFrame:Hide();
        StaticPopup1:SetFrameStrata("DIALOG");
        MetaMapNotesEditFrame:SetParent("UIParent");
        MetaMapNotesEditFrame:SetFrameStrata("FULLSCREEN");
        MetaMapNotesSendFrame:SetParent("UIParent");
        MetaMapNotesSendFrame:SetFrameStrata("FULLSCREEN");
end


function MetaMap_OnEvent(event)
        if(event == "ADDON_LOADED" and arg1 == "MetaMap") then
                MetaMap_SetWorldMap();
                MetaMap_SetVars();
                MetaMap_LoadZones();
                MetaMap_VerifyData();
                MetaMap_OptionsDialogInit();
                MetaMap_FilterInit();
        end
        if(event == "VARIABLES_LOADED") then
                MetaMap_CurrentSaveSet = MetaMapOptions.SaveSet;
                MetaMapOptions_Init();
                MetaMapMenu_Init();
                if(myAddOnsFrame_Register) then
                        myAddOnsFrame_Register(MetaMap_Details);
                end
                if MetaMapNotes_MiniNote_Data.icon == "party" then
                        MetaMapNotes_ClearMiniNote(true);
                end
                if MetaMapNotes_MiniNote_Data.icon ~= nil then
                        MiniNotePOITexture:SetTexture(METAMAP_ICON_PATH.."Icon"..MetaMapNotes_MiniNote_Data.icon);
                end
                MetaMap_OrigWorldMapButton_OnClick = WorldMapButton_OnClick;
                WorldMapButton_OnClick = MetaMapNotes_WorldMapButton_OnClick;
                MetaMap_OrigChatFrame_OnEvent = ChatFrame_OnEvent;
                ChatFrame_OnEvent = MetaMap_ChatFrame_OnEvent;
                MetaMap_SetNUNtooltip();
                if(MetaMapOptions.WKBalwaysOn) then MetaMap_LoadWKB(3); end
                if(MetaMapOptions.BWPalwaysOn) then MetaMap_LoadBWP(0, 3); end
                if(MetaMapOptions.FWMretain) then MetaMap_LoadFWM(); end
                MetaMap_VarsLoaded = true;
        end
        if(event == "INSTANCE_MAP_UPDATE") then
                if(not MetaMap_VarsLoaded) then return; end
                if(IsAddOnLoaded("MetaMapWKB")) then
                        MetaKB_OnEvent("INSTANCE_MAP_UPDATE");
                else
                        MetaMapContainerFrame:Hide();
                end
                MetaMapNotes_HideAll();
                MetaMap_Refresh();
                MetaMap_ZoneHeader();
        end
        if(event == "WORLD_MAP_UPDATE") then
                if(not MetaMap_VarsLoaded) then return; end
                if(MetaMap_CurrentMap ~= GetCurrentMapZone() and MetaMapFrame:IsVisible()) then
                        MetaMap_Toggle(false);
                end
                MetaMap_CurrentMap = GetCurrentMapZone();
                if(MetaMapOptions.usePOI) then
                        MetaMapPOI_OnEvent(1);
                end
                if(not IsAddOnLoaded("MetaMapWKB")) then
                        MetaMapContainerFrame:Hide();
                end
                if(MetaMap_CurrentMap ~= 0) then
                        MetaMapNotes_HideAll();
                end
                MetaMapOptions_Init();
                MetaMapNotes_MapUpdate();
                MetaMap_ZoneHeader();
        end
        if(event == "ZONE_CHANGED_NEW_AREA") then
                if(not MetaMap_VarsLoaded) then return; end
                SetMapToCurrentZone();
                MetaMapNotes_MiniNote_OnUpdate(0);
                if(MetaMapOptions.usePOI) then
                        MetaMapPOI_OnEvent(2);
                end
                if(WorldMapFrame:IsVisible()) then
                        MetaMapNotes_MapUpdate();
                end
                MetaMapNotes_HideAll();
        end
        if(event == "PLAYER_ENTERING_WORLD") then
                if(not MetaMap_VarsLoaded) then return; end
                MetaMap_CurrentMap = GetCurrentMapZone();
                local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
                if(zone == 0) then return; end
                local pX, pY = GetPlayerMapPosition("Player");
                if(pX == 0 and pY == 0 and continent == 0) then
                        MetaMapOptions.MetaMapZone = zone;
                        MetaMap_Toggle(true);
                end
        end
        if(event == "MINIMAP_UPDATE_ZOOM") then
                MetaMapNotes_MinimapUpdateZoom();
        end
end

function MetaMap_ChatFrame_OnEvent(...)
        local event = unpack(arg);
        if(strsub(event, 1, 16) == "CHAT_MSG_WHISPER" and strsub(arg1, 1, 6) == "<MapN>") then
                if(arg2 ~= UnitName("player")) then
                        MetaMapNotes_GetNoteFromChat(arg1, arg2);
                end
        else
                MetaMap_OrigChatFrame_OnEvent(unpack(arg));
        end
end

function MetaMap_VerifyData()
        local TempData = {}
        for continent=0, 2, 1 do
                local numZones = table.getn(MetaMap_ZoneNames[continent]);
                TempData[continent] = {};
                for zone, zoneTable in MetaMapNotes_Data[continent] do
                        if(zone <= numZones) then
                                TempData[continent][zone] = {};
                                local newIndex = 1;
                                for i, value in MetaMapNotes_Data[continent][zone] do
                                        local newNote = MetaMapNotes_Data[continent][zone][i];
                                        if(newNote.xPos and newNote.yPos and newNote.name) then
                                                TempData[continent][zone][newIndex] = value;
                                                newIndex = newIndex +1;
                                        end
                                end
                        end
                end
        end
        for continent, value in MetaMapNotes_Data do
                if(type(continent) == "String") then
                        TempData[continent] = {};
                        TempData[continent] = value;
                end
        end
        MetaMapNotes_Data = {};
        MetaMapNotes_Data = TempData;
        TempData = {};
        for continent=0, 2, 1 do
                local numZones = table.getn(MetaMap_ZoneNames[continent]);
                TempData[continent] = {};
                for zone, zoneTable in MetaMapNotes_Lines[continent] do
                        if(zone <= numZones) then
                                TempData[continent][zone] = {};
                                local newIndex = 1;
                                for i, value in MetaMapNotes_Lines[continent][zone] do
                                        TempData[continent][zone][newIndex] = value;
                                        newIndex = newIndex +1;
                                end
                        end
                end
        end
        for continent, value in MetaMapNotes_Lines do
                if(type(continent) == "String") then
                        TempData[continent] = {};
                        TempData[continent] = value;
                end
        end
        MetaMapNotes_Lines = {};
        MetaMapNotes_Lines = TempData;
        TempData = nil;
end

function MetaMap_VerifyNotes()
        if(MetaMapNotes_Data == nil) then
                MetaMapNotes_Data = {};
                MetaMapNotes_Data[0] = {};
                MetaMapNotes_Data[1] = {};
                MetaMapNotes_Data[2] = {};
        end
        if(MetaMapNotes_Data[0] == nil) then
                MetaMapNotes_Data[0] = {};
        end
        if(MetaMapNotes_Data[1] == nil) then
                MetaMapNotes_Data[1] = {};
        end
        if(MetaMapNotes_Data[2] == nil) then
                MetaMapNotes_Data[2] = {};
        end
end

function MetaMap_VerifyLines()
        if(MetaMapNotes_Lines == nil) then
                MetaMapNotes_Lines = {};
                MetaMapNotes_Lines[0] = {};
                MetaMapNotes_Lines[1] = {};
                MetaMapNotes_Lines[2] = {};
        end
        if(MetaMapNotes_Lines[0] == nil) then
                MetaMapNotes_Lines[0] = {};
        end
        if(MetaMapNotes_Lines[1] == nil) then
                MetaMapNotes_Lines[1] = {};
        end
        if(MetaMapNotes_Lines[2] == nil) then
                MetaMapNotes_Lines[2] = {};
        end
end

function MetaMap_LoadZones()
        MetaMap_VerifyNotes();
        MetaMap_VerifyLines();
        for zoneKey in MetaMap_Data do
                if(MetaMapNotes_Data[0][zoneKey] == nil) then
                        MetaMapNotes_Data[0][zoneKey] = {};
                end
                if(MetaMapNotes_Lines[0][zoneKey] == nil) then
                        MetaMapNotes_Lines[0][zoneKey] = {};
                end
                MetaMap_ZoneNames[0][zoneKey] = MetaMap_Data[zoneKey]["ZoneName"];
        end
        for continentKey,continentName in ipairs{GetMapContinents()} do
                MetaMap_ZoneNames[continentKey] = {};
                for zoneKey,zoneName in ipairs{GetMapZones(continentKey)} do
                        if(MetaMapNotes_Data[continentKey][zoneKey] == nil) then
                                MetaMapNotes_Data[continentKey][zoneKey] = {};
                        end
                        if(MetaMapNotes_Lines[continentKey][zoneKey] == nil) then
                                MetaMapNotes_Lines[continentKey][zoneKey] = {};
                        end
                        MetaMap_ZoneNames[continentKey][zoneKey] = zoneName;
                end
        end
end

function MetaMap_NameToZoneID(zoneText, mode)
        for continentKey in MetaMapNotes_Data do
                if zoneText == MetaMap_ZoneNames[continentKey] then
                        return zoneText, 0;
                end
        end
        for continentKey in MetaMap_ZoneNames do
                for zoneKey in MetaMap_ZoneNames[continentKey] do
                        if zoneText == MetaMap_ZoneNames[continentKey][zoneKey] then
                                return continentKey, zoneKey;
                        end
                end
        end
        if(type(zoneText) == "string" and strlen(zoneText) >0 and mode == nil) then
                if(MetaMapNotes_Data[zoneText] == nil) then
                        MetaMapNotes_Data[zoneText] = {};
                        MetaMapNotes_Lines[zoneText] = {};
                end
                return zoneText, 0;
        end
        return 0, 0;
end

function MetaMap_GetCurrentMapInfo()
        local continent, zone, currentZone, mapName;
        continent = GetCurrentMapContinent();
        zone = GetCurrentMapZone();
        if(MetaMapFrame:IsVisible()) then
                continent = 0;
                zone = MetaMapOptions.MetaMapZone;
                currentZone = MetaMapNotes_Data[continent][zone];
                mapName = MetaMap_Data[zone]["ZoneName"];
        elseif(continent == -1) then
                if(MetaMapNotes_Data[GetRealZoneText()] == nil) then
                        MetaMapNotes_Data[GetRealZoneText()] = {};
                        MetaMapNotes_Lines[GetRealZoneText()] = {};
                end
                currentZone = MetaMapNotes_Data[GetRealZoneText()];
                mapName = GetRealZoneText();
        elseif(continent > 0) then
                currentZone = MetaMapNotes_Data[continent][zone];
                mapName = MetaMap_ZoneNames[continent][zone];
        end
        if(continent == 1 and mapName == nil) then
                mapName = "Kalimdor";
        elseif(continent == 2 and mapName == nil) then
                mapName = "Eastern Kingdoms";
        elseif(mapName == nil) then
                mapName = "World";
        end
        return continent, zone, currentZone, mapName;
end

function MetaMap_ToggleFrame(frame)
        if frame:IsVisible() then
                HideUIPanel(frame);
        else
                ShowUIPanel(frame);
        end
end

function MetaMapContainer_ShowFrame(frame, header, footer, info)
        if(frame == nil) then
                MetaMapContainer_CurrentFrame = nil;
                MetaMapContainerFrame:Hide();
                return;
        end
        if(header ~= nil) then
                MetaMapContainer_HeaderText:SetText(header);
                MetaMapContainer_HeaderText:Show();
        else
                MetaMapContainer_HeaderText:Hide();
        end
        if(footer ~= nil) then
                MetaMapContainer_FooterText:SetText(footer);
                MetaMapContainer_FooterText:Show();
        else
                MetaMapContainer_FooterText:Hide();
        end
        if(info ~= nil) then
                MetaMapContainer_InfoText:SetText(info);
                MetaMapContainer_InfoText:Show();
        else
                MetaMapContainer_InfoText:Hide();
        end
        if(MetaMapContainer_CurrentFrame ~= nil) then
                MetaMapContainer_CurrentFrame:Hide();
        end
        MetaMapContainer_CurrentFrame = frame;
        MetaMapContainer_CurrentFrame:Show();
        MetaMapContainerFrame:Show();
end

function MetaMap_FullScreenToggle()
        local mMap = false;
        local continent = GetCurrentMapContinent();
        local zone = GetCurrentMapZone();
        if(MetaMapFrame:IsVisible()) then
                MetaMapShown = true;
        end
        if(MetaMap_FullScreenMode) then
                WorldMapFrame:SetScript("OnKeyDown", nil);
                WorldMapFrame:SetScript("OnKeyUp", nil);
                UIPanelWindows["WorldMapFrame"] =       { area = "center",      pushable = 9 };
                MetaMapNotesEditFrame:SetParent("UIParent");
                MetaMapNotesEditFrame:SetFrameStrata("FULLSCREEN");
                MetaMapNotesSendFrame:SetParent("UIParent");
                MetaMapNotesSendFrame:SetFrameStrata("FULLSCREEN");
                MetaMapMenu:SetParent("UIParent");
                MetaMapMenu:SetFrameStrata("FULLSCREEN");
                UIPanelWindows['MetaMapMenu'] = {area = 'center', pushable = 0};
                MetaMap_FullScreenMode = false;
                BlackoutWorld:Hide();
                if(WorldMapFrame:IsVisible()) then
                        CloseAllWindows();
                        ShowUIPanel(WorldMapFrame);
                end
                MetaMapOptions_Init();
        else
                MetaMapMenu:SetParent("WorldMapFrame");
                MetaMapNotesEditFrame:SetParent("WorldMapFrame");
                MetaMapNotesSendFrame:SetParent("WorldMapFrame");
                WorldMapFrame:SetScale(1.0);
                WorldMapFrame:SetScript("OnKeyDown", WMF_OldScript);
                WorldMapFrame:SetScript("OnKeyUp", X_Frame:GetScript("OnKeyUp"));
                UIPanelWindows["WorldMapFrame"] =       { area = "full",        pushable = 0 };
                BlackoutWorld:Show();
                MetaMap_FullScreenMode = true;
                if(WorldMapFrame:IsVisible()) then
                        CloseAllWindows();
                        ShowUIPanel(WorldMapFrame);
                end
        end
        SetMapZoom(continent, zone);
        if(MetaMapShown) then MetaMap_Toggle(true); end
end

function MetaMap_Toggle(show)
        if(show) then
                ShowUIPanel(MetaMapFrame);
                HideUIPanel(WorldMapDetailFrame);
                HideUIPanel(WorldMapButton);
                ShowWorldMapArrowFrame(0);
        else
                HideUIPanel(MetaMapFrame);
                ShowUIPanel(WorldMapDetailFrame);
                ShowUIPanel(WorldMapButton);
                ShowWorldMapArrowFrame(1);
        end
        MetaMap_OnEvent("INSTANCE_MAP_UPDATE");
end

function MiniMapCoords_OnUpdate()
        if (MetaMapOptions.MetaMapMiniCoords and Minimap:IsVisible()) then
                local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
                local px, py = GetPlayerMapPosition("player");
                if(zone == 0) then
                        MetaMapMiniCoords:SetText("Dead Zone");
                elseif((continent == GetCurrentMapContinent() and zone == GetCurrentMapZone() and px ~= 0) or (type(continent) == "string" and px ~= 0)) then
                        MetaMapMiniCoords:SetText(MetaMap_round(px * 100)..","..MetaMap_round(py * 100));
                elseif(px == 0 and py == 0 and continent == 0) then --GetRealZoneText() == MetaMap_Data[MetaMapOptions.MetaMapZone]["ZoneName"]) then
                        MetaMapMiniCoords:SetText("Instance");
                elseif(continent == GetCurrentMapContinent() and zone == GetCurrentMapZone()) then
                        MetaMapMiniCoords:SetText("Dead Zone");
                end
                MetaMapMiniCoords:Show();
        else
                MetaMapMiniCoords:Hide();
        end
end

function MetaMapCoordsWorldMap_OnUpdate()
        if (MetaMapOptions.MetaMapCoords and WorldMapFrame:IsVisible()) then
                local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
                local x, y = GetCursorPosition();
                local px, py = GetPlayerMapPosition("player");
                local OFFSET_X = 0.0022;
                local OFFSET_Y = -0.0262;
                local centerX, centerY = WorldMapFrame:GetCenter();
                local width = WorldMapButton:GetWidth();
                local height = WorldMapButton:GetHeight();
                x = x / WorldMapFrame:GetEffectiveScale();
                y = y / WorldMapFrame:GetEffectiveScale();
                local adjustedX = (x - (centerX - (width/2))) / width;
                local adjustedY = (centerY + (height/2) - y ) / height;
                x = 100 * (adjustedX + OFFSET_X);
                y = 100 * (adjustedY + OFFSET_Y);
                if(x < 0 or y < 0 or x > 100 or y > 100) then
                        MetaMapCoordsCursor:SetText("");
                else
                        MetaMapCoordsCursor:SetText("|cffffffff"..format("%d,%d",x, y));
                end
                if(zone == 0) then
                        MetaMapCoordsPlayer:SetText("|cff00ff00Dead Zone");
                elseif(px == 0 and py == 0 and GetRealZoneText() == MetaMap_Data[MetaMapOptions.MetaMapZone]["ZoneName"]) then
                        MetaMapCoordsPlayer:SetText("|cff00ff00Instance");
                elseif((continent == GetCurrentMapContinent() and zone == GetCurrentMapZone() and px == 0) or (type(continent) == "string" and px == 0)) then
                        MetaMapMiniCoords:SetText("Dead Zone");
                elseif(px == 0 and py == 0) then
                        MetaMapCoordsPlayer:SetText("");
                else
                        MetaMapCoordsPlayer:SetText("|cff00ff00"..MetaMap_round(px * 100)..","..MetaMap_round(py * 100));
                end
        end
end

function MetaMap_UpdateBackDrop()
        if(MetaMapOptions.SaveSet == 1) then
                MetaMapOptions.BDshader1 = MetaMap_BackDropSlider:GetValue();
                MetaMap_MapBackDrop:SetAlpha(MetaMapOptions.BDshader1);
        else
                MetaMapOptions.BDshader2 = MetaMap_BackDropSlider:GetValue();
                MetaMap_MapBackDrop:SetAlpha(MetaMapOptions.BDshader2);
        end
        if(MetaMapOptions.ShowMapList) then
                MetaMap_MapBackDrop:SetWidth(MetaMapFrame:GetWidth() - MetaMap_MapListFrame:GetWidth() -1);
        else
                MetaMap_MapBackDrop:SetWidth(MetaMapFrame:GetWidth());
        end
        MetaMap_MapBackDrop:SetHeight(MetaMapFrame:GetHeight());
end

function MetaMap_UpdateAlpha()
        if(MetaMapOptions.SaveSet == 1) then
                MetaMapOptions.MetaMapAlpha1 = MetaMapAlphaSlider:GetValue();
                WorldMapFrame:SetAlpha(MetaMapOptions.MetaMapAlpha1);
        else
                MetaMapOptions.MetaMapAlpha2 = MetaMapAlphaSlider:GetValue();
                WorldMapFrame:SetAlpha(MetaMapOptions.MetaMapAlpha2);
        end
        MetaMapMainCoords:SetAlpha(255);
        MetaMapMenu:SetAlpha(255);
        WorldMapButton:SetAlpha(MetaMapAlphaSlider:GetValue() + 0.2);
end

function MetaMap_UpdateScale()
        if(not MetaMap_FullScreenMode) then
                if(MetaMapOptions.SaveSet == 1) then
                        MetaMapOptions.MetaMapScale1 = MetaMapScaleSlider:GetValue();
                        SetEffectiveScale(WorldMapFrame, MetaMapOptions.MetaMapScale1);
                else
                        MetaMapOptions.MetaMapScale2 = MetaMapScaleSlider:GetValue();
                        SetEffectiveScale(WorldMapFrame, MetaMapOptions.MetaMapScale2);
                end
                MetaMapTopFrame:SetWidth(WorldMapButton:GetWidth()+10);
                MetaMapTopFrame:SetHeight(WorldMapButton:GetHeight()+100);
        end
end

function MetaMap_UpdateTTScale()
        if(MetaMapOptions.SaveSet == 1) then
                MetaMapOptions.MetaMapTTScale1 = MetaMapTTScaleSlider:GetValue();
                WorldMapTooltip:SetScale(MetaMapOptions.MetaMapTTScale1);
        else
                MetaMapOptions.MetaMapTTScale2 = MetaMapTTScaleSlider:GetValue();
                WorldMapTooltip:SetScale(MetaMapOptions.MetaMapTTScale2);
        end
        MetaMap_SetNUNtooltip();
end

function MetaMapFrameDropDown_Initialize()
        local DropDownList = {};
        for zoneKey in MetaMap_Data do
                local detail = {zone = zoneKey, location = MetaMap_Data[zoneKey]["ZoneName"]};
    table.insert(DropDownList, detail);
        end
        local sort = MetaMap_sortType;
        MetaMap_sortType = METAMAP_SORTBY_LOCATION;
  table.sort(DropDownList, MetaMap_SortCriteria);
        MetaMap_sortType = sort;

        for zoneKey in DropDownList do
                local info = {
                        text = DropDownList[zoneKey]["location"];
                        value = DropDownList[zoneKey]["zone"];
                        func = MetaMapDropDown_OnClick;
                };
                UIDropDownMenu_AddButton(info);
        end
        UIDropDownMenu_SetSelectedValue(MetaMapFrameDropDown, MetaMapOptions.MetaMapZone);
end

function MetaMapDropDown_OnClick()
        local id = this:GetID();
        UIDropDownMenu_SetSelectedID(MetaMapFrameDropDown, id);
        MetaMapOptions.MetaMapZone = this.value;
        MetaMap_Toggle(true);
end

function MetaMap_Refresh()
        if(MetaMapOptions.MetaMapZone > 0 and MetaMapOptions.MetaMapZone < table.getn(MetaMap_Data)+1) then
                MetaMap_MapImage:SetTexture(METAMAP_MAP_PATH..MetaMap_Data[MetaMapOptions.MetaMapZone]["texture"]);
                MetaMapText_Instance:SetText("|cffffffff"..MetaMap_Data[MetaMapOptions.MetaMapZone]["ZoneName"]);
                MetaMapNotes_MapUpdate();
        end
end

function MetaMapMenu_Init()
        local x = 1; local y = 1;
        for i, menudata in METAMAPMENU_LIST do
                local flag = false;
                local button = getglobal("MetaMapMenu_Option"..x);
                button:SetHeight(METAMAPMENU_BUTTON_HEIGHT);
                button.shade = false;
                if(x == 1) then
                        button.toggle = MetaMapOptions.MetaMapCoords;
                elseif(x == 2) then
                        button.toggle = MetaMapOptions.MetaMapMiniCoords;
                elseif(x == 3) then
                        button.toggle = false;
                elseif(x == 4) then
                        if(MetaMapOptions.SaveSet == 1) then
                                button.toggle = MetaMapOptions.ActionMode1;
                        else
                                button.toggle = MetaMapOptions.ActionMode2;
                        end
                elseif(x == 5) then
                        button.toggle = false;
                        getglobal("MetaMapMenu_Option"..x.."Text"):SetText(MetaMapOptions.SaveSet)
                elseif(x == 6) then
                        if(MetaMapFrame:IsVisible()) then
                                button.shade = true;
                                button.toggle = false;
                        else
                                flag = true;
                        end
                elseif(x == 7) then
                        -- spacer
                elseif(x == 8) then
                        button.toggle = false;
                elseif(x == 9) then
                        if(IsAddOnLoaded("FlightMap")) then
                                button.toggle = false;
                        else
                                flag = true;
                        end
                elseif(x == 10) then
                        if(IsAddOnLoaded("Gatherer")) then
                                button.toggle = false;
                        else
                                flag = true;
                        end
                elseif(x == 11) then
                                button.toggle = false;
                elseif(x == 12) then
                        if(IsAddOnLoaded("CT_MapMod")) then
                                button.toggle = MetaMapOptions.UseMapMod;
                        else
                                MetaMapOptions.UseMapMod = false;
                                flag = true;
                        end
                elseif(x == 13) then
                        button.toggle = false;
                elseif(x == 14) then
                        button.toggle = FWM_ShowUnexplored;
                end
                
                if(flag) then
                        button:SetHeight(1);
                        button:Hide();
                        y = y - 1;
                elseif(menudata.name == "Spacer") then
                        button:SetHeight(8);
                        button:Hide();
                else
                        if button.toggle then
                                getglobal("MetaMapMenu_Option"..x.."Check"):Show();
                        else
                                getglobal("MetaMapMenu_Option"..x.."Check"):Hide();
                        end
                        if button.shade then
                                getglobal("MetaMapMenu_Option"..x.."Shade"):SetTexture(METAMAP_IMAGE_PATH.."Color"..MetaMapOptions.ShadeSet);
                                getglobal("MetaMapMenu_Option"..x.."Shade"):Show();
                        else
                                getglobal("MetaMapMenu_Option"..x.."Shade"):Hide();
                        end
                        button:SetText(menudata.name);
                        button:Show();
                end
                x = x + 1; y = y + 1;
        end
        MetaMapMenu:SetHeight((METAMAPMENU_BUTTON_HEIGHT * y) + (METAMAPMENU_BUTTON_HEIGHT * 2));
end

function MetaMapMenu_Select(id)
        id = tonumber(id)
        local button = getglobal("MetaMapMenu_Option"..id);
        if button.toggle then
                button.toggle = false;
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
        else
                button.toggle = true;
                getglobal("MetaMapMenu_Option"..id.."Check"):Show()
        end
        if(id == 1) then
                MetaMapOptions.MetaMapCoords = button.toggle;
                MetaMapOptions_Init();  
        elseif(id == 2) then
                MetaMapOptions.MetaMapMiniCoords = button.toggle;
                MetaMapOptions_Init();  
        elseif(id == 3) then
                if(MetaMapFilterMenu:IsVisible()) then
                        MetaMapFilterMenu:Hide();
                else
                        MetaMapFilterMenu:Show();
                end
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
        elseif(id == 4) then
                ActionMode = button.toggle;
                if(MetaMapOptions.SaveSet == 1) then
                        MetaMapOptions.ActionMode1 = button.toggle;
                else
                        MetaMapOptions.ActionMode2 = button.toggle;
                end
                MetaMapOptions_Init();  
        elseif(id == 5) then
                MetaMapSaveSet_Toggle();
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
                getglobal("MetaMapMenu_Option"..id.."Text"):SetText(MetaMapOptions.SaveSet)
                MetaMapOptions_Init();  
        elseif(id == 6) then
                MetaMapShadeSet_Toggle();
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
                getglobal("MetaMapMenu_Option"..id.."Shade"):SetTexture(METAMAP_IMAGE_PATH.."Color"..MetaMapOptions.ShadeSet);
                MetaMapOptions_Init();  
        elseif(id == 7) then
                -- spacer
        elseif(id == 8) then
                MetaMapExtOptions_Toggle();
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
        elseif(id == 9) then
                FlightMapOptions_Toggle();
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
        elseif(id == 10) then
                GathererOptions_Toggle();
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
        elseif(id == 11) then
                MetaMap_LoadBWP();
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
        elseif(id == 12) then
                MetaMapOptions.UseMapMod = button.toggle;
        elseif(id == 13) then
                MetaMap_LoadWKB();
                getglobal("MetaMapMenu_Option"..id.."Check"):Hide()
        elseif(id == 14) then
                FWM_ShowUnexplored = button.toggle;
                MetaMap_LoadFWM(1);
        end
end

function MetaMapMenu_OnShow(mode)
        MetaMapMenu:ClearAllPoints();
        local setBottom = false;
        local x, y = GetCursorPosition();
        if(y < (UIParent:GetHeight() /2)) then setBottom = true; end
        if(MetaMap_FullScreenMode) then
                x = x / WorldMapFrame:GetEffectiveScale();
                y = y / WorldMapFrame:GetEffectiveScale();
        else
                x = x / UIParent:GetEffectiveScale();
                y = y / UIParent:GetEffectiveScale();
        end
        if(mode == "FuBar" or mode == "Titan") then
                if(mode == "FuBar") then
                        y = y + 10
                end
                if(setBottom) then
                        MetaMapMenu:SetPoint("BOTTOM", "UIParent", "BOTTOMLEFT", x, y);
                else
                        MetaMapMenu:SetPoint("TOP", "UIParent", "BOTTOMLEFT", x, y);
                end
                MetaMapSliderMenu:Hide();
                MetaMapMenu:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 32, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }});
                MetaMapFilterMenu:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 32, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }});
        elseif(mode == "Minimap") then
                if(setBottom) then
                        MetaMapMenu:SetPoint("BOTTOMRIGHT", "UIParent", "BOTTOMLEFT", x +10, y +10);
                else
                        MetaMapMenu:SetPoint("TOPRIGHT", "UIParent", "BOTTOMLEFT", x +10, y +10);
                end
                MetaMapSliderMenu:Show();
                MetaMapButtonSlider:Show();
                MetaMapAlphaSlider:Hide();
                MetaMap_BackDropSlider:Hide();
                MetaMapScaleSlider:Hide();
                MetaMapTTScaleSlider:Hide();
                MetaMapSliderMenu:SetHeight(55);
                MetaMapMenu:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 32, edgeSize = 32, insets = { left = 11, right = 12, top = 12, bottom = 11 }});
                MetaMapFilterMenu:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 32, edgeSize = 32, insets = { left = 11, right = 12, top = 12, bottom = 11 }});
        elseif(mode == "Mainmap") then
                MetaMapMenu:SetPoint("TOP", "UIParent", "BOTTOMLEFT", x, y);
                MetaMapSliderMenu:Show();
                MetaMapButtonSlider:Hide();
                MetaMapAlphaSlider:Show();
                MetaMapScaleSlider:Show();
                MetaMapTTScaleSlider:Show();
                if(MetaMapFrame:IsVisible()) then
                        MetaMap_BackDropSlider:Show();
                        MetaMapSliderMenu:SetHeight(130);
                else
                        MetaMap_BackDropSlider:Hide();
                        MetaMapSliderMenu:SetHeight(105);
                end
                MetaMapMenu:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 32, edgeSize = 32, insets = { left = 11, right = 12, top = 12, bottom = 11 }});
                MetaMapFilterMenu:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 32, edgeSize = 32, insets = { left = 11, right = 12, top = 12, bottom = 11 }});
        end
        MetaMapMenu:Show();
end

function MetaMapMenu_OnUpdate()
        if (MetaMapMenu:IsVisible()) then
                if (not MouseIsOver(MetaMapMenu) and not MouseIsOver(MetaMapButton)
                        and not MouseIsOver(MetaMap_OptionsButton) and not MouseIsOver(MetaMapSliderMenu)
                        and not MouseIsOver(TitanPanelMetaMapButton) and not MouseIsOver(MetaMapFilterMenu)) then
                        MetaMapMenu:Hide();
                        MetaMapFilterMenu:Hide();
                end
        end
end

function MetaMap_FilterInit()
        for i=0, 9, 1 do
                getglobal("MetaMapSubMenu_Option"..i):SetChecked(MetaMap_NoteFilter[i]);
                getglobal("MetaMapSubMenu_Option"..i.."Texture"):SetTexture(METAMAP_ICON_PATH.."Icon"..i);
        end
end

function MetaMap_FilterNotes(setAll)
        if(setAll ~= nil) then
                for i=0, 9, 1 do
                        getglobal("MetaMapSubMenu_Option"..i):SetChecked(setAll);
                        MetaMap_NoteFilter[i] = setAll;
                end
        else
                for i=0, 9, 1 do
                        if(getglobal("MetaMapSubMenu_Option"..i):GetChecked()) then
                                MetaMap_NoteFilter[i] = true;
                        else
                                MetaMap_NoteFilter[i] = false;
                        end
                end
        end
        MetaMapNotes_MapUpdate();
end

function MetaMap_ToggleDialog(tab)
        local subFrame = getglobal(tab);
        MetaMap_GeneralDialog:Hide();
        MetaMap_NotesDialog:Hide();
        MetaKB_HoldingFrame:Hide();
        MetaFWM_HoldingFrame:Hide();
        MetaMap_ImportDialog:Hide();
        MetaMap_ZoneShiftDialog:Hide();
        if(MetaMapBKP_BackUpFrame ~= nil and MetaMapBKP_BackUpFrame:IsVisible()) then
                MetaMapBKP_BackUpFrame:Hide();
        end
        if(subFrame) then
                if(MetaMap_DialogFrame:IsVisible()) then
                        PlaySound("igCharacterInfoTab");
                        getglobal(tab):Show();
                else
                        ShowUIPanel(MetaMap_DialogFrame);
                        getglobal(tab):Show();
                end
        end
end

function MetaMap_OptionsTab_OnClick()
        if(this:GetName() == "MetaMap_DialogFrameTab1") then
                MetaMap_ToggleDialog("MetaMap_GeneralDialog");
        elseif(this:GetName() == "MetaMap_DialogFrameTab2") then
                MetaMap_ToggleDialog("MetaMap_NotesDialog");
        elseif(this:GetName() == "MetaMap_DialogFrameTab3") then
                MetaMap_ToggleDialog("MetaKB_HoldingFrame");
        elseif(this:GetName() == "MetaMap_DialogFrameTab4") then
                MetaMap_ToggleDialog("MetaFWM_HoldingFrame");
        elseif(this:GetName() == "MetaMap_DialogFrameTab5") then
                MetaMap_ToggleDialog("MetaMap_ImportDialog");
        elseif(this:GetName() == "MetaMap_DialogFrameTab6") then
                MetaMap_ToggleDialog("MetaMap_ZoneShiftDialog");
        end
        PlaySound("igCharacterInfoTab");
end

function MetaMapExtOptions_Toggle()
        if(MetaMap_DialogFrame:IsVisible()) then
                HideUIPanel(MetaMap_DialogFrame);
        else
                if(MetaMap_FullScreenMode) then
                        MetaMap_DialogFrame:SetParent("WorldMapFrame");
                end
                ShowUIPanel(MetaMap_DialogFrame);
        end
end

function MetaMapSaveSet_Toggle()
        if(MetaMapOptions.SaveSet == 1) then
                MetaMapOptions.SaveSet = 2;
        else
                MetaMapOptions.SaveSet = 1;
        end
        MetaMapOptions_Init();
        MetaMap_CurrentSaveSet = MetaMapOptions.SaveSet;
end

function MetaMap_MapModeToggle(mode)
        MetaMapOptions.SaveSet = mode;
        MetaMap_ToggleFrame(WorldMapFrame);
end

function MetaMapShadeSet_Toggle()
        if(MetaMapOptions.ShadeSet == 1) then
                MetaMapOptions.ShadeSet = 2;
        elseif(MetaMapOptions.ShadeSet == 2) then
                MetaMapOptions.ShadeSet = 3;
        elseif(MetaMapOptions.ShadeSet == 3) then
                MetaMapOptions.ShadeSet = 4;
        elseif(MetaMapOptions.ShadeSet == 4) then
                MetaMapOptions.ShadeSet = 1;
        end
        MetaMapOptions_Init();
end

function MetaMap_OptionsDialogInit()
        MetaMap_MenuModeCheckButton:SetChecked(MetaMapOptions.MenuMode);
        MetaMap_TTWrapCheckButton:SetChecked(MetaMapOptions.TooltipWrap);
        MetaMap_MiniButtonCheckButton:SetChecked(MetaMapOptions.MetaMapButtonShown);
        MetaMap_POICheckButton:SetChecked(MetaMapOptions.usePOI);
        MetaMap_ListColorsButton:SetChecked(MetaMapOptions.ListColors);
        MetaMap_ZoneHeaderButton:SetChecked(MetaMapOptions.ZoneHeader);
        MetaMap_LastNoteHighlight:SetChecked(MetaMapOptions.LastHighlight);
        MetaMap_LastMiniHighlight:SetChecked(MetaMapOptions.LastMiniHighlight);
        MetaMap_AcceptIncoming:SetChecked(MetaMapOptions.AcceptIncoming);
        MetaMap_PartyAsMini:SetChecked(MetaMapOptions.MiniParty);
        MetaMap_ShowCreator:SetChecked(MetaMapOptions.MetaMapShowAuthor);
end

function MetaMapOptions_Init()
        local ActionMode = false;
        MetaMap_MapBackDrop:SetTexture(METAMAP_SHADER_PATH.."Shader"..MetaMapOptions.ShadeSet);
        MetaMapMiniCoords:SetTextColor(MetaMapNotes_Colors[MetaMapOptions.MiniColor].r, MetaMapNotes_Colors[MetaMapOptions.MiniColor].g, MetaMapNotes_Colors[MetaMapOptions.MiniColor].b);
        
        if(MetaMapOptions.SaveSet == 1) then
                if(MetaMapOptions.MetaMapAlpha1 < 0.15) then MetaMapOptions.MetaMapAlpha1 = 0.15; end
                MetaMapScaleSlider:SetValue(MetaMapOptions.MetaMapScale1);
                MetaMap_BackDropSlider:SetValue(MetaMapOptions.BDshader1);
                MetaMapAlphaSlider:SetValue(MetaMapOptions.MetaMapAlpha1);
                MetaMapTTScaleSlider:SetValue(MetaMapOptions.MetaMapTTScale1);
                ActionMode = MetaMapOptions.ActionMode1;
        else
                if(MetaMapOptions.MetaMapAlpha2 < 0.15) then MetaMapOptions.MetaMapAlpha2 = 0.15; end
                MetaMapScaleSlider:SetValue(MetaMapOptions.MetaMapScale2);
                MetaMap_BackDropSlider:SetValue(MetaMapOptions.BDshader2);
                MetaMapAlphaSlider:SetValue(MetaMapOptions.MetaMapAlpha2);
                MetaMapTTScaleSlider:SetValue(MetaMapOptions.MetaMapTTScale2);
                ActionMode = MetaMapOptions.ActionMode2;
        end
        if(ActionMode) then
                WorldMapButton:EnableMouse(false);
                MetaMapTopFrame:EnableMouse(false);
                MetaMapFrame:EnableMouse(false);
        else
                WorldMapButton:EnableMouse(true);
                MetaMapTopFrame:EnableMouse(true);
                MetaMapFrame:EnableMouse(true);
        end
        if(MetaMapOptions.MetaMapButtonShown) then
                MetaMapButtonSlider:SetValue(MetaMapOptions.MetaMapButtonPosition);
                MetaMapButton_UpdatePosition();
                MetaMapButton:Show();
        else
                MetaMapButton:Hide();
        end
        if(MetaMapOptions.MetaMapCoords) then
                MetaMapMainCoords:Show();
        else
                MetaMapMainCoords:Hide();
        end
        if(MetaMapOptions.MetaMapMiniCoords) then
                MetaMap_MiniCoords:Show();
        else
                MetaMap_MiniCoords:Hide();
        end
        if(MetaMapOptions.ShowMapList) then
                MetaMapList_Init();
        else
                MetaMap_MapListFrame:Hide();
        end
        MetaMap_UpdateAlpha();
        MetaMap_UpdateScale();
        MetaMap_UpdateTTScale();
        MetaMap_UpdateBackDrop();
end

function MetaMapButton_UpdatePosition()
        MetaMapButton:SetPoint("TOPLEFT", "Minimap", "TOPLEFT",
                52 - (80 * cos(MetaMapOptions.MetaMapButtonPosition)),
                (80 * sin(MetaMapOptions.MetaMapButtonPosition)) - 52
        );
end

function MetaMap_ButtonTooltip()
        GameTooltip_SetDefaultAnchor(GameTooltip, UIParent);
        GameTooltip_SetDefaultAnchor(GameTooltip, UIParent);
        GameTooltip:SetText(METAMAP_TITLE, 0, 1, 0);
        GameTooltip:AddLine(METAMAP_BUTTON_TOOLTIP1, 1, 1, 1);
        if(MetaMapOptions.MenuMode) then
                GameTooltip:AddLine(METAMAP_BUTTON_TOOLTIP2, 1, 1, 1);
        end
        GameTooltip:Show();
end

function MetaMap_round(num, idp)
  local mult = 10^(idp or 0);
  return (math.floor(num * mult + 0.5) / mult);
end

function SetEffectiveScale(frame, scale)
        frame.scale = scale;
        local parent = frame:GetParent();
        if(parent) then
                scale = scale / parent:GetEffectiveScale();
        end
        frame:SetScale(scale);
end

function MiniMapCoords_OnClick()
        local mmc = MetaMapOptions.MiniColor;
        if(IsShiftKeyDown() and ChatFrameEditBox:IsVisible()) then
                local msg = "My location: "..GetRealZoneText().." ("..MetaMapMiniCoords:GetText()..")";
                ChatFrameEditBox:Insert(msg);
        elseif(IsControlKeyDown()) then
                if(mmc == 9) then
                        mmc = 0;
                else
                        mmc = mmc +1;
                end
                MetaMapMiniCoords:SetTextColor(MetaMapNotes_Colors[mmc].r, MetaMapNotes_Colors[mmc].g, MetaMapNotes_Colors[mmc].b);
        end
        MetaMapOptions.MiniColor = mmc;
end

function MetaMapList_Init()
        if(not MetaMapOptions.ShowMapList) then
                return;
        end
        if(MetaMapOptions.SortList) then
                MetaMapList_Header:SetText(METAMAPLIST_UNSORTED);
        else
                MetaMapList_Header:SetText(METAMAPLIST_SORTED);
        end
        MetaMap_MapListFrame:Show();
        MetaMapPing_OnUpdate(30)
        FauxScrollFrame_SetOffset(MetaMapList_ScrollFrame, MetaMap_ListOffset);
        MetaMapList_BuildList();
        if(not MetaMap_NoteList[1]) then
                MetaMap_MapListFrame:Hide();
                return;
        end
        MetaMapList_UpdateScroll();
end

function MetaMapList_OnClick(button, id)
        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
        if(button       == "LeftButton")        then
                if(IsControlKeyDown())  then
                        local LootID = MetaMapNotes_Data[continent][zone][id].lootid;
                        local Name = MetaMapNotes_Data[continent][zone][id].name;
                        MetaMap_LoadBLT(LootID, Name);
                elseif(IsShiftKeyDown() and ChatFrameEditBox:IsVisible())       then
                        if(not currentZone) then return; end
                        local tname = currentZone[id].name;
                        local tinf1 = currentZone[id].inf1;
                        local x = MetaMap_round(currentZone[id].xPos *100);
                        local y = MetaMap_round(currentZone[id].yPos *100);
                        local tzone = MetaMap_ZoneNames[continent][zone];
                        if(strlen(tinf1) > 0) then tinf1 = " ["..tinf1.."] "; end
                        local msg = tname.." "..tinf1.." ("..tzone.." - "..x..","..y..")";
                        ChatFrameEditBox:Insert(msg);
                elseif(id == 0) then
                        MetaMapPing_SetPing(currentZone, id);
                else
                        MetaMapPing_SetPing(currentZone, MetaMap_NoteList[this:GetID() + MetaMap_ListOffset].id);
                end
        elseif(button   == "RightButton")       then
                if(IsControlKeyDown() or IsShiftKeyDown()) then
                        -- Maybe for other functions.
                else
                        MetaMapNotes_Note_OnClick("LeftButton", id);
                end
        end
end

function MetaMapList_BuildList()
        MetaMap_NoteList = {};
        local zone = GetCurrentMapZone();
        local continent = GetCurrentMapContinent();
        local selectedZone;
        MetaMapList_InfoText:Hide();
        MetaMapList_PlayerButton:Hide();

        if(MetaMapFrame:IsVisible()) then
                continent = 0;
                selectedZone = MetaMapNotes_Data[0][MetaMapOptions.MetaMapZone];
        elseif(continent == -1) then
                selectedZone = MetaMapNotes_Data[GetRealZoneText()];
        else
                selectedZone = MetaMapNotes_Data[continent][zone];
        end
        local playerContinent, playerZone = MetaMap_NameToZoneID(GetRealZoneText());
        if(continent == playerContinent and zone == playerZone and not MetaMapFrame:IsVisible()) then
                getglobal("MetaMapList_PlayerButton".."Name"):SetText(UnitName("Player"));
                MetaMapList_PlayerButton:Show();
        elseif(MetaMapFrame:IsVisible()) then
                MetaMapList_InfoText:Show();
        end
        if(not selectedZone or zone < 0) then
                MetaMap_MapListFrame:Hide();
        else
                local index = 1;
                for i, value in selectedZone do
                        if(MetaMap_NoteFilter[selectedZone[i].icon]) then
                        MetaMap_NoteList[index] = {};
                        MetaMap_NoteList[index]["name"] = selectedZone[i]["name"];
                        MetaMap_NoteList[index]["xPos"] = selectedZone[i]["xPos"];
                        MetaMap_NoteList[index]["yPos"] = selectedZone[i]["yPos"];
                        MetaMap_NoteList[index]["ncol"] = selectedZone[i]["ncol"];
                        MetaMap_NoteList[index]["icon"] = selectedZone[i]["icon"];
                        MetaMap_NoteList[index]["id"] = i;
                        MetaMap_NoteList.lastEntry = index;
                        index = index +1;
                        end
                end
                if(MetaMapOptions.SortList) then
                        local sort = MetaMap_sortType;
                        MetaMap_sortType = METAMAP_SORTBY_NAME;
                  table.sort(MetaMap_NoteList, MetaMap_SortCriteria);
                        MetaMap_sortType = sort;
                end
        end
end

function MetaMapList_UpdateScroll()
        for i = 1, METAMAPLIST_SCROLL_FRAME_BUTTONS_SHOWN, 1 do
                local buttonIndex = i + FauxScrollFrame_GetOffset(MetaMapList_ScrollFrame);
                local scrollFrameButton = getglobal("MetaMapList_ScrollFrameButton"..i);
                local NameButton = getglobal("MetaMapList_ScrollFrameButton"..i.."Name");
                if(buttonIndex < MetaMap_NoteList.lastEntry +1) then
                        MetaMap_ListOffset = buttonIndex - i;
                        NameButton:SetText(MetaMap_NoteList[buttonIndex]["name"]);
                        getglobal("MetaMapList_ScrollFrameButton"..i.."NoteID"):SetText(MetaMap_NoteList[buttonIndex]["id"]);
                        if(MetaMapOptions.ListColors) then
                                local cNr = MetaMap_NoteList[buttonIndex]["ncol"]
                                NameButton:SetTextColor(MetaMapNotes_Colors[cNr].r, MetaMapNotes_Colors[cNr].g, MetaMapNotes_Colors[cNr].b);
                        else
                                NameButton:SetTextColor(MetaMapNotes_Colors[0].r, MetaMapNotes_Colors[0].g, MetaMapNotes_Colors[0].b);
                        end
                        scrollFrameButton:Show();
                else
                        scrollFrameButton:Hide();
                end
        end
        FauxScrollFrame_Update(MetaMapList_ScrollFrame, MetaMap_NoteList.lastEntry,
                METAMAPLIST_SCROLL_FRAME_BUTTONS_SHOWN, METAMAPLIST_SCROLL_FRAME_BUTTON_HEIGHT);
end

function MetaMapPing_SetPing(currentZone, id)
        if(MetaMapPing:IsVisible()) then
                MetaMapPing:Hide();
                return;
        end
        local x, y;
        if(id == 0) then
                MetaMapPing:SetParent(WorldMapButton);
                x, y = GetPlayerMapPosition("player");
        else
                MetaMapPing:SetParent(getglobal("MetaMapNotesPOI"..id));
                x = currentZone[id]["xPos"];
                y = currentZone[id]["yPos"];
        end
        x = (x * WorldMapButton:GetWidth()) - (WorldMapButton:GetScale() * 7);
        y = (-y * WorldMapButton:GetHeight()) - (WorldMapButton:GetScale() * 7);
        MetaMapPing:SetPoint("CENTER", WorldMapButton, "TOPLEFT", x, y);
        MetaMapPing:SetAlpha(255);
        MetaMapPing.timer = MetaMap_PingTime;
        MetaMapPing:Show();
        PlaySound("MapPing");
end

function MetaMapPing_OnUpdate(elapsed)
        if(MetaMapPing:IsVisible()) then
                if ( MetaMapPing.timer > 0 ) then
                        MetaMapPing.timer = MetaMapPing.timer - elapsed;
                else
                        MetaMapPing:Hide();
                end
        end
end

function MetaMap_ZoneHeader()
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        MetaMapNotes_ZoneSearchResult:SetText(format(METAMAPNOTES_ZONESEARCH_TEXT, mapName));
        if(not MetaMapOptions.ZoneHeader) then
                MetaMap_ZoneHeaderFrame:Hide();
                return;
        end
        local realContinent, realZone = MetaMap_NameToZoneID(GetRealZoneText());
        if(realZone == nil) then realZone = 0; end
        continent = "|cfff0B300Map Continent: |cffffffff"..continent;
        zone = "   |cfff0B300Map Zone: |cffffffff"..mapName.." ("..zone..")";
        realContinent = "|cfff0B300Real Continent: |cffffffff"..realContinent;
        realZone = "   |cfff0B300Real Zone: |cffffffff"..GetRealZoneText().." ("..realZone..")";
        MetaMapZoneHeaderText1:SetText(continent..zone);
        MetaMapZoneHeaderText2:SetText(realContinent..realZone);
        MetaMap_ZoneHeaderFrame:SetWidth(WorldMapDetailFrame:GetWidth()-200);
        MetaMap_ZoneHeaderFrame:Show();
end

function MetaMap_LoadImports()
        if(not IsAddOnLoaded("MetaMapCVT")) then
                LoadAddOn("MetaMapCVT");
        end
        if(IsAddOnLoaded("MetaMapCVT")) then
                MetaMap_LoadExportsButton:Disable();
                MetaMapCVT_CheckData();
        else
                MetaMap_ImportHeader:SetTextColor(1,0,0);
                MetaMap_ImportHeader:SetText(METAMAPCVT_NOLOAD);
        end
end

function MetaMap_LoadExports()
        if(not IsAddOnLoaded("MetaMapEXP")) then
                LoadAddOn("MetaMapEXP");
        end
        if(IsAddOnLoaded("MetaMapEXP")) then
                MetaMap_LoadImportsButton:Disable();
                MetaMapEXP_CheckData();
        else
                MetaMap_ImportHeader:SetTextColor(1,0,0);
                MetaMap_ImportHeader:SetText(METAMAPEXP_NOT_ENABLED);
        end
end

function MetaMap_ZSMOnShow()
        if(GetLocale() == "deDE") then
                        MetaMapZSM_TextHeader:SetText("German client detected");
        elseif(GetLocale() == "frFR") then
                        MetaMapZSM_TextHeader:SetText("French client detected");
        else
                MetaMap_LoadZSMButton:Disable();
                MetaMapZSM_TextHeader:SetText("English client detected - no zoneshift required");
        end
end

function MetaMap_LoadZSM()
        if(not IsAddOnLoaded("MetaMapZSM")) then
                LoadAddOn("MetaMapZSM");
        end
        if(IsAddOnLoaded("MetaMapZSM")) then
                MetaMapZSM_TextHeader:Hide();
                MetaMap_LoadZSMButton:Hide();
        else
                MetaMap_LoadZSMButton:Disable();
                MetaMapZSM_TextHeader:SetText(METAMAPZSM_NOT_ENABLED);
        end
end

function MetaMap_LoadBKP()
        if(not IsAddOnLoaded("MetaMapBKP")) then
                LoadAddOn("MetaMapBKP");
        end
        if(IsAddOnLoaded("MetaMapBKP")) then
                MetaMap_GeneralDialog:Hide();
                MetaMapBKP_BackUpFrame:Show();
        else
                MetaMap_LoadBKP:Disable();
                MetaMapBKP_NoLoad:Show();
        end
end

function MetaMap_LoadBLT(lootID, Name)
        if(not IsAddOnLoaded("MetaMapBLT")) then
                LoadAddOn("MetaMapBLT");
        end
        if(IsAddOnLoaded("MetaMapBLT")) then
                MetaMapBLT_ClassMenu:Hide();
                MetaMapBLT_OnSelect(lootID, Name);
        else
                MetaMap_StatusPrint("MetaMapBLT addon is not enabled!", true);
        end
end
        
function MetaMap_LoadBWP(id, mode)
        if(not IsAddOnLoaded("MetaMapBWP")) then
                LoadAddOn("MetaMapBWP");
        end
        if(IsAddOnLoaded("MetaMapBWP")) then
                if(mode == nil) then
                        BWP_CallMenu();
                elseif(mode == 1) then
                        MetaKBMenu_RBSelect(id);
                elseif(mode == 2) then
                        MetaMapNotes_RBSelect(id);
                end
        else
                MetaMap_StatusPrint(METAMAPBWP_NOT_ENABLED, true);
        end
end

function MetaMap_LoadWKB(mode)
        if(not IsAddOnLoaded("MetaMapWKB")) then
                LoadAddOn("MetaMapWKB");
        end
        if(IsAddOnLoaded("MetaMapWKB")) then
                if(mode == nil or mode == 1) then
                        MetaKB_ToggleFrame(mode);
                elseif(mode == 2) then
                        MetaKB_UpdateKeySelectedUnit();
                end
        else
                if(MetaKB_HoldingFrame:IsVisible()) then
                        MetaKB_HoldingFrameInfo:SetText(METAKB_NOT_ENABLED);
                else
                        MetaMap_StatusPrint(METAKB_NOT_ENABLED, true);
                end
        end
end

function MetaMap_LoadFWM(mode)
        if(not IsAddOnLoaded("MetaMapFWM")) then
                LoadAddOn("MetaMapFWM");
        end
        if(IsAddOnLoaded("MetaMapFWM")) then
                if(mode == nil) then
                        FWM_ShowUnexplored = true;
                end 
                WorldMapFrame_Update();
        else
                FWM_ShowUnexplored = false;
                MetaMapOptions.FWMretain = false;
                if(MetaFWM_HoldingFrame:IsVisible()) then
                        MetaFWM_HoldingFrameInfo:SetText(METAMAPFWM_NOT_ENABLED);
                else
                        MetaMap_StatusPrint(METAMAPFWM_NOT_ENABLED, true);
                end
        end
end

function MetaMap_HelpOnEnter(header, ...)
        local myArgs = { unpack(arg) };
        GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
        GameTooltip:SetText(header, 0.2, 0.5, 1, true);
        for i,string in myArgs do
                GameTooltip:AddLine(string, 1, 1, 1, true);
        end
        GameTooltip:Show();
end

function MetaMap_StatusPrint(msg, display, r, g, b)
        if(not display) then return; end
        msg = "<"..METAMAP_TITLE..">: "..msg;
        if DEFAULT_CHAT_FRAME then
                if(r == nil or g == nil or b == nil) then
                        r = 0.60;
                        g = 0.80;
                        b = 1.00;
                end
                DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b);
        end
end

function MetaMap_CreateNoteObject(noteNumber)
        local button;
        if(getglobal("MetaMapNotesPOI"..noteNumber)) then
                button = getglobal("MetaMapNotesPOI"..noteNumber);
        else
                button = CreateFrame("Button" ,"MetaMapNotesPOI"..noteNumber, WorldMapButton, "MetaMapNotes_NoteTemplate");
                button:SetID(noteNumber);
                MetaMapNotes_LastNote = MetaMapNotes_LastNote +1;
        end
        return button;
end

function MetaMap_CreateLineObject(lineNumber)
        local line;
        if(getglobal("MetaMapNotesLines_"..lineNumber)) then
                line = getglobal("MetaMapNotesLines_"..lineNumber);
        else
                MetaMapNotesLinesFrame:CreateTexture("MetaMapNotesLines_"..lineNumber, "ARTWORK");
                line = getglobal("MetaMapNotesLines_"..lineNumber);
                MetaMapNotes_LastLine = MetaMapNotes_LastLine +1;
        end
        return line
end

function MetaMapNotes_AddNewNote(continent, zone, xPos, yPos, name, inf1, inf2, creator, icon, ncol, in1c, in2c, mininote)
        if(xPos == 0 and yPos == 0) then
                MetaMap_StatusPrint(METAMAPNOTES_INVALIDZONE, true);
                return;
        end
        if(continent == nil or zone == nil or xPos == nil or yPos == nil or name == nil) then return; end
        if(inf1 == nil) then inf1 = ""; end
        if(inf2 == nil) then inf2 = ""; end
        if(icon == nil) then icon = 0; end
        if(ncol == nil) then ncol = 0; end
        if(in1c == nil) then in1c = 0; end
        if(in2c == nil) then in2c = 0; end
        if(creator == nil) then creator = unitName("player"); end
        local id = 0;
        local index = 0;
        local checkNote;
        local returnValue = true;
        local currentZone = MetaMapNotes_Data[continent][zone];
        if(continent == -1 or type(continent) == "string") then
                currentZone = MetaMapNotes_Data[continent]
        else
                index = MetaMapNotes_GetZoneTableSize(currentZone);
        end

        if(mininote == 0 or mininote == nil) then
                MetaMapNotes_SetNextAsMiniNote = 0;
        elseif(mininote == 1) then
                MetaMapNotes_SetNextAsMiniNote = 1;
        elseif(mininote == 2) then
                MetaMapNotes_SetNextAsMiniNote = 2;
        end             

        if(MetaMapNotes_SetNextAsMiniNote ~= 2) then
                checkNote = MetaMapNotes_CheckNearNotes(continent, zone, xPos, yPos);
                if(checkNote) then
                        returnValue = false;
                else
                        MetaMapNotes_TempData_Id = index + 1
                        currentZone[MetaMapNotes_TempData_Id] = {};
                        currentZone[MetaMapNotes_TempData_Id].name = name;
                        currentZone[MetaMapNotes_TempData_Id].ncol = ncol;
                        currentZone[MetaMapNotes_TempData_Id].inf1 = inf1;
                        currentZone[MetaMapNotes_TempData_Id].in1c = in1c;
                        currentZone[MetaMapNotes_TempData_Id].inf2 = inf2;
                        currentZone[MetaMapNotes_TempData_Id].in2c = in2c;
                        currentZone[MetaMapNotes_TempData_Id].creator = creator;
                        currentZone[MetaMapNotes_TempData_Id].icon = icon;
                        currentZone[MetaMapNotes_TempData_Id].xPos = xPos;
                        currentZone[MetaMapNotes_TempData_Id].yPos = yPos;
                        id = MetaMapNotes_TempData_Id;
                        if(MetaMapNotes_MiniNote_Data ~= nil and MetaMapNotes_MiniNote_Data.name == name) then
                                MetaMapNotes_MiniNote_Data.id = id;
                        end
                        returnValue = true;
                end
        end
        if(MetaMapNotes_SetNextAsMiniNote ~= 0) then
                for i=0, index, 1 do
                if(currentZone[i] ~= nil) then
                        if(currentZone[i].name == name and currentZone[i].xPos == xPos and currentZone[i].yPos == yPos) then
                                id = i;
                                break;
                        end
                end
                end
                MetaMapNotes_SetMiniNote(id, continent, zone, xPos, yPos, name, inf1, inf2, creator, icon, ncol, in1c, in2c);
                returnValue = returnValue;
        end
        return returnValue, checkNote;
end

function MetaMapNotes_SetMiniNote(id, continent, zone, xPos, yPos, name, inf1, inf2, creator, icon, ncol, in1c, in2c)
        if(type(continent) == "string") then
                MetaMap_StatusPrint(METAMAPNOTES_INVALIDZONE, true);
                return;
        end
        local currentZone;
        local mapName = MetaMap_ZoneNames[continent][zone];

        MetaMapNotes_MiniNote_Data.id = id;
        MetaMapNotes_MiniNote_Data.continent = continent;
        MetaMapNotes_MiniNote_Data.zone = zone;
        MetaMapNotes_MiniNote_Data.zonetext = mapName;
        MetaMapNotes_MiniNote_Data.inf1 = "";
        MetaMapNotes_MiniNote_Data.inf2 = "";
        MetaMapNotes_MiniNote_Data.in1c = 1;
        MetaMapNotes_MiniNote_Data.in2c = 1;
        MetaMapNotes_MiniNote_Data.color = 0;
        MetaMapNotes_MiniNote_Data.creator = creator;
        if(id == 0) then
                MetaMapNotes_MiniNote_Data.xPos = xPos;
                MetaMapNotes_MiniNote_Data.yPos = yPos;
                MetaMapNotes_MiniNote_Data.name = name;
                MetaMapNotes_MiniNote_Data.inf1 = inf1;
                MetaMapNotes_MiniNote_Data.inf2 = inf2;
                MetaMapNotes_MiniNote_Data.in1c = in1c;
                MetaMapNotes_MiniNote_Data.in2c = in2c;
                MetaMapNotes_MiniNote_Data.color = ncol;
                MetaMapNotes_MiniNote_Data.icon = icon;
        elseif(id == -1) then
                MetaMapNotes_MiniNote_Data.xPos = MetaMapNotes_PartyNoteData.xPos;
                MetaMapNotes_MiniNote_Data.yPos = MetaMapNotes_PartyNoteData.yPos;
                MetaMapNotes_MiniNote_Data.name = METAMAPNOTES_PARTYNOTE;
                MetaMapNotes_MiniNote_Data.icon = "party";
        elseif(id > 0) then
                currentZone = MetaMapNotes_Data[continent][zone][id];
                MetaMapNotes_MiniNote_Data.xPos = currentZone.xPos;
                MetaMapNotes_MiniNote_Data.yPos = currentZone.yPos;
                MetaMapNotes_MiniNote_Data.name = currentZone.name;
                MetaMapNotes_MiniNote_Data.inf1 = currentZone.inf1;
                MetaMapNotes_MiniNote_Data.inf2 = currentZone.inf2;
                MetaMapNotes_MiniNote_Data.in1c = currentZone.in1c;
                MetaMapNotes_MiniNote_Data.in2c = currentZone.in2c;
                MetaMapNotes_MiniNote_Data.color = currentZone.ncol;
                MetaMapNotes_MiniNote_Data.icon = currentZone.icon;
                MetaMapNotes_MiniNote_Data.creator = currentZone.creator;
        end
        MiniNotePOITexture:SetTexture(METAMAP_ICON_PATH.."Icon"..MetaMapNotes_MiniNote_Data.icon);
        MiniNotePOI:Show();
        MetaMapNotes_SetNextAsMiniNote = 0;
        MetaMapNotesButtonMiniNoteOff:Enable();
        MetaMapNotes_MapUpdate();
end

function MetaMapNotes_CheckNearNotes(continent, zone, xPos, yPos)
        local currentZone = MetaMapNotes_Data[continent][zone];
        if(currentZone == nil) then return; end
        for i, value in currentZone do
                local deltax = abs(currentZone[i].xPos - xPos);
                local deltay = abs(currentZone[i].yPos - yPos);
                if(deltax <= 0.0009765625 * MetaMapNotes_MinDiff and deltay <= 0.0013020833 * MetaMapNotes_MinDiff) then
                        return i;
                end
        end
        return false;
end

function MetaMapNotes_GenerateSendString(version)
-- <MapN> c<1> z<1> x<0.123123> y<0.123123> t<> i1<> i2<> cr<> i<8> tf<3> i1f<5> i2f<6>
        local text = ""
        local pName = UnitName("player");
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        if(not currentZone) then return; end
        zone = MetaMapNotes_ZoneShift[continent][zone];
        currentZone = MetaMapNotes_Data[continent][zone];
        if(version == 1) then text = "<MapN>"; end
        text = text.." c<"..continent.."> z<"..zone..">";

        if(MetaMapNotes_PartyNoteSet) then
                local xPos = floor(MetaMapNotes_PartyNoteData.xPos * 1000000)/1000000;
                local yPos = floor(MetaMapNotes_PartyNoteData.yPos * 1000000)/1000000;
                text = text.." x<"..xPos.."> y<"..yPos..">";
                text = text.." t<"..METAMAPNOTES_PARTYNOTE..">";
                text = text.." i1<>";
                text = text.." i2<>";
                text = text.." cr<"..pName..">";
                text = text.." i<0>";
                text = text.." tf<0>";
                text = text.." i1f<0>";
                text = text.." i2f<0>";
                text = text.." p<1>";
        elseif(MetaMapNotes_MiniNote_Data.id == 0) then
                local xPos = floor(MetaMapNotes_MiniNote_Data.xPos * 1000000)/1000000;
                local yPos = floor(MetaMapNotes_MiniNote_Data.yPos * 1000000)/1000000;
                text = text.." x<"..xPos.."> y<"..yPos..">";
                text = text.." t<"..MetaMapNotes_EliminateUsedChars(MetaMapNotes_MiniNote_Data.name)..">";
                text = text.." i1<"..MetaMapNotes_EliminateUsedChars(MetaMapNotes_MiniNote_Data.inf1)..">";
                text = text.." i2<"..MetaMapNotes_EliminateUsedChars(MetaMapNotes_MiniNote_Data.inf2)..">";
                text = text.." cr<"..MetaMapNotes_MiniNote_Data.creator..">";
                text = text.." i<"..MetaMapNotes_MiniNote_Data.icon..">";
                text = text.." tf<"..MetaMapNotes_MiniNote_Data.color..">";
                text = text.." i1f<"..MetaMapNotes_MiniNote_Data.in1c..">";
                text = text.." i2f<"..MetaMapNotes_MiniNote_Data.in2c..">";
        else
                if(not currentZone[MetaMapNotes_TempData_Id].creator) then
                        currentZone[MetaMapNotes_TempData_Id].creator = pName;
                end
                local xPos = floor(currentZone[MetaMapNotes_TempData_Id].xPos * 1000000)/1000000; --cut to six digits behind the 0
                local yPos = floor(currentZone[MetaMapNotes_TempData_Id].yPos * 1000000)/1000000;
                text = text.." x<"..xPos.."> y<"..yPos..">";
                text = text.." t<"..MetaMapNotes_EliminateUsedChars(currentZone[MetaMapNotes_TempData_Id].name)..">";
                text = text.." i1<"..MetaMapNotes_EliminateUsedChars(currentZone[MetaMapNotes_TempData_Id].inf1)..">";
                text = text.." i2<"..MetaMapNotes_EliminateUsedChars(currentZone[MetaMapNotes_TempData_Id].inf2)..">";
                text = text.." cr<"..currentZone[MetaMapNotes_TempData_Id].creator..">";
                text = text.." i<"..currentZone[MetaMapNotes_TempData_Id].icon..">";
                text = text.." tf<"..currentZone[MetaMapNotes_TempData_Id].ncol..">";
                text = text.." i1f<"..currentZone[MetaMapNotes_TempData_Id].in1c..">";
                text = text.." i2f<"..currentZone[MetaMapNotes_TempData_Id].in2c..">";
        end
        MetaMapNotes_PartyNoteSet = false;
        return text;
end

function MetaMapNotes_EliminateUsedChars(text)
        text = string.gsub(text, "<", "")
        text = string.gsub(text, ">", "")
        return text
end

function MetaMapNotes_GetSendString(msg, who)
        local continent = gsub(msg,".*<MapN+> c<([^>]*)>.*","%1",1)+0;
        local zone = gsub(msg,".*<MapN+>%s+%w+.*z<([^>]*)>.*","%1",1)+0;
        local xPos = gsub(msg,".*<MapN+>%s+%w+.*x<([^>]*)>.*","%1",1)+0;
        local yPos = gsub(msg,".*<MapN+>%s+%w+.*y<([^>]*)>.*","%1",1)+0;
        local name = gsub(msg,".*<MapN+>%s+%w+.*t<([^>]*)>.*","%1",1);
        local inf1 = gsub(msg,".*<MapN+>%s+%w+.*i1<([^>]*)>.*","%1",1);
        local inf2 = gsub(msg,".*<MapN+>%s+%w+.*i2<([^>]*)>.*","%1",1);
        local creator = gsub(msg,".*<MapN+>%s+%w+.*cr<([^>]*)>.*","%1",1);
        local icon = gsub(msg,".*<MapN+>%s+%w+.*i<([^>]*)>.*","%1",1)+0;
        local ncol = gsub(msg,".*<MapN+>%s+%w+.*tf<([^>]*)>.*","%1",1)+0;
        local in1c = gsub(msg,".*<MapN+>%s+%w+.*i1f<([^>]*)>.*","%1",1)+0;
        local in2c = gsub(msg,".*<MapN+>%s+%w+.*i2f<([^>]*)>.*","%1",1)+0;
        zone = MetaMapNotes_ZoneShift[continent][zone];
        local setNote, nearNote = MetaMapNotes_AddNewNote(continent, zone, xPos, yPos, name, inf1, inf2, creator, icon, ncol, in1c, in2c, MetaMapNotes_SetNextAsMiniNote);
        if(who == nil) then
                if(setNote) then
                        MetaMap_StatusPrint(format(METAMAPNOTES_ACCEPT_NOTE, MetaMap_ZoneNames[continent][zone]), true);
                else
                        MetaMap_StatusPrint(format(METAMAPNOTES_DECLINE_NOTE, MetaMapNotes_Data[continent][zone][nearNote].name, MetaMap_ZoneNames[continent][zone]), true);
                end
        else
                if(setNote) then
                        MetaMap_StatusPrint(format(METAMAPNOTES_ACCEPT_GET, who, MetaMap_ZoneNames[continent][zone]), true);
                else
                        MetaMap_StatusPrint(format(METAMAPNOTES_DECLINE_GET, who, MetaMap_ZoneNames[continent][zone], MetaMapNotes_Data[continent][zone][nearNote].name), true);
                end
        end
        return setNote;
end

function MetaMapNotes_Quicknote(msg)
        local currentZone;
        local continent, zone = MetaMap_NameToZoneID(GetRealZoneText())
        if(type(continent) == "string") then
                SetMapToCurrentZone();
                tx, ty = GetPlayerMapPosition("player");
                if(tx == 0 or tx == nil) then
                        MetaMap_StatusPrint(METAMAPNOTES_INVALIDZONE, true);
                        return;
                end
                currentZone = MetaMapNotes_Data[continent];
        else
                currentZone = MetaMapNotes_Data[continent][zone];
        end
        local name = METAMAPNOTES_QUICKNOTE_DEFAULTNAME;
        if(msg ~= "" and msg ~= nil) then
                if(strlen(msg) == 1) then
                        mode = tonumber(strsub(msg, 1, 1));
                        msg = "";
                else
                        local mCheck = strsub(msg, 1, 2);
                        if(mCheck == "1 " or mCheck == "2 " or mCheck == "3 ") then
                                mode = tonumber(strsub(msg, 1, 1));
                                msg = strsub(msg, 3);
                        else
                                mode = MetaMapNotes_SetNextAsMiniNote;
                        end
                end
        else
                mode = MetaMapNotes_SetNextAsMiniNote;
        end
        local i,j,x,y,tmp = string.find(msg,"%s*(%d+)%s*[,.]%s*(%d+)%s*([^%c]*)");
        if(x == nil or y == nil) then
                SetMapToCurrentZone();
                x, y = GetPlayerMapPosition("player");
        else
                x = x / 100;
                y = y / 100;
                msg = tmp;
        end
        if(mode == 3) then
                MetaMapNotes_vnote_xPos = x;
                MetaMapNotes_vnote_yPos = y;
                MetaMap_StatusPrint(METAMAPNOTES_VNOTE_SET, true);
                return;
        end
        if msg ~= "" and msg ~= nil then
                name = string.sub(msg,string.find(msg,"%s*([^%c]*)"));
        end
        local checkNote, nearNote = MetaMapNotes_AddNewNote(continent, zone, x, y, name, "", "", UnitName("player"), 0, 0, 0, 0, mode);
        if(checkNote) then
                if(mode ~= 2) then
                        MetaMap_StatusPrint(format(METAMAPNOTES_ACCEPT_NOTE, GetRealZoneText()), true);
                end
        else
                MetaMap_StatusPrint(format(METAMAPNOTES_DECLINE_NOTE, currentZone[nearNote].name, GetRealZoneText()), true);
        end
        if(mode > 0) then
                MetaMap_StatusPrint(format(METAMAPNOTES_ACCEPT_MININOTE, GetRealZoneText()), true);
        end
        MetaMapNotes_Qnote = false;
end

function MetaMapNotes_QuickNoteShow()
        local x, y = GetPlayerMapPosition("player");
        x = MetaMap_round(x*100);
        y = MetaMap_round(y*100);
        Coords_EditBox:SetText(x..","..y);
        MiniNote_CheckButton:SetChecked(false);
        MetaMapNotes_Qnote = true;
end

function MetaMapNotes_SetQuickNote(mode)
        local msg;
        if(mode == 1) then
                msg = Coords_EditBox:GetText().." "..Note_EditBox:GetText();
        else
                msg = "3 "..Coords_EditBox:GetText();
        end
        MetaMapNotes_Quicknote(msg);
end

function MetaMapNotes_GetNoteFromChat(msg, who)
        if(not MetaMapOptions.AcceptIncoming) then
                MetaMap_StatusPrint(format(METAMAPNOTES_DISABLED_GET, who), true)
                return;
        end
        if(gsub(msg,".*<MapN+>%s+%w+.*p<([^>]*)>.*","%1",1) == "1") then -- Party Note
                local id = -1;
                local continent = gsub(msg,".*<MapN+> c<([^>]*)>.*","%1",1)+0;
                local zone = gsub(msg,".*<MapN+>%s+%w+.*z<([^>]*)>.*","%1",1)+0;
                local xPos = gsub(msg,".*<MapN+>%s+%w+.*x<([^>]*)>.*","%1",1)+0;
                local yPos = gsub(msg,".*<MapN+>%s+%w+.*y<([^>]*)>.*","%1",1)+0;
                local icon = "party";
                zone = MetaMapNotes_ZoneShift[continent][zone];
                MetaMapNotes_PartyNoteData.continent = continent;
                MetaMapNotes_PartyNoteData.zone = zone;
                MetaMapNotes_PartyNoteData.xPos = xPos;
                MetaMapNotes_PartyNoteData.yPos = yPos;
                if(MetaMapOptions.MiniParty) then
                        MetaMapNotes_SetMiniNote(id, continent, zone, xPos, yPos, name, inf1, inf2, creator, icon, ncol, in1c, in2c);
                        MetaMap_StatusPrint(format(METAMAPNOTES_PARTY_GET, who, MetaMap_ZoneNames[continent][zone]), true)
                end
        else
                MetaMapNotes_GetSendString(msg, who);
        end
end

function MetaMapNotes_GetNoteBySlashCommand(msg)
        if msg ~= "" and msg ~= nil then
                msg = "<MapN> "..msg;
                return MetaMapNotes_GetSendString(msg);
        else
                MetaMap_StatusPrint(METAMAPNOTES_MAPNOTEHELP, true);
                return false;
        end
end

function MetaMapNotes_Misc_OnClick(button)
        if(not MetaMapNotes_FramesHidden()) then return; end
        if button == "LeftButton" then
                if(this:GetID() == 0) then
                        MetaMapNotes_TempData_Id = 0;
                        MetaMapNotes_OpenEditForExistingNote(MetaMapNotes_TempData_Id);
                elseif(this:GetID() == 1) then
                        MetaMapNotes_PartyNoteSet = true;
                        MetaMapNotes_TempData_Id = -1;
                        MetaMapNotes_ShowSendFrame(1);
                end
        end
end

function MetaMapNotes_NextMiniNote(msg)
        msg = string.lower(msg)
        if msg == "on" then
                MetaMapNotes_SetNextAsMiniNote = 1
        elseif msg == "off" then
                MetaMapNotes_SetNextAsMiniNote = 0
        elseif MetaMapNotes_SetNextAsMiniNote == 1 then
                MetaMapNotes_SetNextAsMiniNote = 0
        else
                MetaMapNotes_SetNextAsMiniNote = 1
        end
end

function MetaMapNotes_NextMiniNoteOnly(msg)
        msg = string.lower(msg)
        if msg == "on" then
                MetaMapNotes_SetNextAsMiniNote = 2
        elseif msg == "off" then
                MetaMapNotes_SetNextAsMiniNote = 0
        elseif MetaMapNotes_SetNextAsMiniNote == 2 then
                MetaMapNotes_SetNextAsMiniNote = 0
        else
                MetaMapNotes_SetNextAsMiniNote = 2
        end
end

function MetaMapNotes_MinimapUpdateZoom()
        if MetaMapNotes_MiniNote_MapzoomInit then
                if MetaMapNotes_MiniNote_IsInCity then
                        MetaMapNotes_MiniNote_IsInCity = false
                else
                        MetaMapNotes_MiniNote_IsInCity = true
                end
        else
                local tempzoom = 0
                if GetCVar("minimapZoom") == GetCVar("minimapInsideZoom") then
                        if GetCVar("minimapInsideZoom")+0 >= 3 then
                                Minimap:SetZoom(Minimap:GetZoom() - 1)
                                tempzoom = 1
                        else
                                Minimap:SetZoom(Minimap:GetZoom() + 1)
                                tempzoom = -1
                        end
                end

                if GetCVar("minimapInsideZoom")+0 == Minimap:GetZoom() then
                        MetaMapNotes_MiniNote_IsInCity = true
                else
                        MetaMapNotes_MiniNote_IsInCity = false
                end

                Minimap:SetZoom(Minimap:GetZoom() + tempzoom)
                MetaMapNotes_MiniNote_MapzoomInit = true
        end
end

function MetaMapNotes_MiniNote_OnUpdate(delay)
        if(MetaMapNotes_MiniNote_Data.xPos == nil or GetRealZoneText() ~= MetaMapNotes_MiniNote_Data.zonetext) then
                MiniNotePOI:Hide();
                return;
        end
        local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
        MiniNotePOI.TimeSinceLastUpdate = MiniNotePOI.TimeSinceLastUpdate + delay;
        if MiniNotePOI.TimeSinceLastUpdate >= MetaMapNotes_Mininote_UpdateRate then
                local x, y = GetPlayerMapPosition("player");
                if x == 0 and y == 0 then
                        MiniNotePOI:Hide()
                        return
                end
                local currentConst
                if(type(continent) == "string") then
                        currentConst = MetaMapNotes_Const[continent]
                elseif continent > 0 and MetaMapNotes_MiniNote_Data.continent > 0 then
                        local c = MetaMapNotes_MiniNote_Data.continent
                        local z = MetaMapNotes_MiniNote_Data.zone
                        currentConst = MetaMapNotes_Const[c][z]
                else
                        MiniNotePOI:Hide();
                        return;
                end
                local currentZoom = Minimap:GetZoom()
                if currentConst and x ~= 0 and y ~= 0 and currentConst.scale ~= 0 then
                        local xscale,yscale
                        if zone > 0 then
                                xscale = MetaMapNotes_Const[MetaMapNotes_MiniNote_Data.continent][currentZoom].xscale
                                yscale = MetaMapNotes_Const[MetaMapNotes_MiniNote_Data.continent][currentZoom].yscale
                        else
                                xscale = MetaMapNotes_Const[2][currentZoom].xscale
                                yscale = MetaMapNotes_Const[2][currentZoom].yscale
                        end

                        if MetaMapNotes_MiniNote_IsInCity then
                                xscale = xscale * MetaMapNotes_Const[2][currentZoom].cityscale
                                yscale = yscale * MetaMapNotes_Const[2][currentZoom].cityscale
                        end
                        local xpos = MetaMapNotes_MiniNote_Data.xPos * currentConst.scale + currentConst.xoffset
                        local ypos = MetaMapNotes_MiniNote_Data.yPos * currentConst.scale + currentConst.yoffset
                        x = x * currentConst.scale + currentConst.xoffset
                        y = y * currentConst.scale + currentConst.yoffset
                        local deltax = (xpos - x) * xscale
                        local deltay = (ypos - y) * yscale
                        if sqrt( (deltax * deltax) + (deltay * deltay) ) > 56.5 then
                                local adjust = 1
                                if deltax == 0 then
                                        deltax = deltax + 0.0000000001
                                elseif deltax < 0 then
                                        adjust = -1
                                end
                                local m = math.atan(deltay / deltax)
                                deltax = math.cos(m) * 57 * adjust
                                deltay = math.sin(m) * 57 * adjust
                        end
                        MiniNotePOI:SetPoint("CENTER", "MinimapCluster", "TOPLEFT", 105 + deltax, -93 - deltay)
                        MiniNotePOI:Show()
                else
                        MiniNotePOI:Hide()
                end
        end
        MiniNotePOI.TimeSinceLastUpdate = 0
end

function MetaMapNotes_MiniNote_OnClick(arg1)
        if(arg1 == "LeftButton" and IsShiftKeyDown() and ChatFrameEditBox:IsVisible()) then
                local x = MetaMap_round(MetaMapNotes_MiniNote_Data.xPos *100);
                local y = MetaMap_round(MetaMapNotes_MiniNote_Data.yPos *100);
                local msg = MetaMapNotes_MiniNote_Data.name.." ("..GetRealZoneText().." - "..x..","..y..")";
                ChatFrameEditBox:Insert(msg);
        else
                if(MetaMapNotes_MiniNote_Data.id > 0) then
                        SetMapToCurrentZone();
                        if(not WorldMapFrame:IsVisible()) then
                                MetaMapNotesEditFrame:SetParent("UIParent");
                        end
                        MetaMapNotes_OpenEditForExistingNote(MetaMapNotes_MiniNote_Data.id);
                elseif(MetaMapNotes_MiniNote_Data.id == 0) then
                        MetaMapNotes_TempData_Id = 0;
                        MetaMapNotes_ShowSendFrame(0);
                else
                        MetaMapNotes_PartyNoteSet = true;
                        MetaMapNotes_TempData_Id = -1;
                        MetaMapNotes_ShowSendFrame(1);
                end
        end
end

function MetaMapNotes_ShowNewFrame(ax, ay)
        if(not MetaMapNotes_FramesHidden()) then return; end
        local width = WorldMapButton:GetWidth();
        local height = WorldMapButton:GetHeight();
        local xOffset,yOffset;
        MetaMapNotes_TempData_xPos = ax;
        MetaMapNotes_TempData_yPos = ay;
        MetaMapNotes_TempData_Id = nil;
        if ax*1002 >= (1002 - 195) then
                xOffset = ax * width - 176;
        else
                xOffset = ax * width;
        end
        if ay*668 <= (668 - 156) then
                yOffset = -(ay * height) - 75;
                else
                yOffset = -(ay * height) + 87;
        end
        MetaMapNotesButtonMiniNoteOff:Disable();
        MetaMapNotesButtonMiniNoteOn:Disable();
        MetaMapNotesButtonDeleteNote:Disable();
        MetaMapNotesButtonToggleLine:Disable();
        MetaMapNotesButtonSendNote:Disable();
        MetaMapNotesButtonMoveNote:Disable();
        MetaMapNotesEditFrameTitle:SetText(METAMAPNOTES_NEW_NOTE);
        MetaMapNotes_OpenEditForNewNote();
end

function MetaMapNotes_OpenEditForNewNote()
        if MetaMapNotes_TempData_Id == 0 then
                MetaMapNotes_vnote_xPos = nil
                MetaMapNotes_vnote_yPos = nil
        end
        MetaMapNotes_TempData_Id = MetaMapNotes_NewNoteSlot()
        MetaMapNotes_TempData_Creator = UnitName("player")
        MetaMapNotes_Edit_SetIcon(0)
        MetaMapNotes_Edit_SetTextColor(0)
        MetaMapNotes_Edit_SetInfo1Color(0)
        MetaMapNotes_Edit_SetInfo2Color(0)
        TitleWideEditBox:SetText("")
        Info1WideEditBox:SetText("")
        Info2WideEditBox:SetText("")
        CreatorWideEditBox:SetText(MetaMapNotes_TempData_Creator)
        MetaMapNotes_HideAll()
        MetaMapNotesEditFrame:Show()
end

function MetaMapNotes_OpenEditForExistingNote(id)
        MetaMapNotes_HideAll();
        MetaMapNotesEditFrameTitle:SetText(METAMAPNOTES_EDIT_NOTE);
        if(MetaMapNotes_MiniNote_Data.xPos == nil) then
                MetaMapNotesButtonMiniNoteOff:Disable();
        else
                MetaMapNotesButtonMiniNoteOff:Enable();
        end
        MetaMapNotesButtonMiniNoteOn:Enable();
        MetaMapNotesButtonDeleteNote:Enable();
        MetaMapNotesButtonToggleLine:Enable();
        MetaMapNotesButtonMoveNote:Enable();

        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
        MetaMapNotes_TempData_Id = id

        if(id == 0) then
                WorldMapTooltip:Hide();
                MetaMapNotes_ShowNewFrame(MetaMapNotes_vnote_xPos, MetaMapNotes_vnote_yPos);
                return;
        elseif(id == -1) then
                WorldMapTooltip:Hide();
                MetaMapNotes_ShowNewFrame(MetaMapNotes_PartyNoteData.xPos, MetaMapNotes_PartyNoteData.yPos);
                return;
        end
        MetaMapNotes_TempData_LootID = nil;
        if(currentZone[MetaMapNotes_TempData_Id].lootid ~= nil)then
                MetaMapNotes_TempData_LootID = currentZone[MetaMapNotes_TempData_Id].lootid
        end
        MetaMapNotes_TempData_Name = currentZone[MetaMapNotes_TempData_Id].name;
        MetaMapNotes_TempData_Creator = currentZone[MetaMapNotes_TempData_Id].creator;
        MetaMapNotes_TempData_xPos = currentZone[MetaMapNotes_TempData_Id].xPos;
        MetaMapNotes_TempData_yPos = currentZone[MetaMapNotes_TempData_Id].yPos;
        MetaMapNotes_Edit_SetIcon(currentZone[MetaMapNotes_TempData_Id].icon);
        MetaMapNotes_Edit_SetTextColor(currentZone[MetaMapNotes_TempData_Id].ncol);
        MetaMapNotes_Edit_SetInfo1Color(currentZone[MetaMapNotes_TempData_Id].in1c);
        MetaMapNotes_Edit_SetInfo2Color(currentZone[MetaMapNotes_TempData_Id].in2c);
        TitleWideEditBox:SetText(currentZone[MetaMapNotes_TempData_Id].name);
        Info1WideEditBox:SetText(currentZone[MetaMapNotes_TempData_Id].inf1);
        Info2WideEditBox:SetText(currentZone[MetaMapNotes_TempData_Id].inf2);
        CreatorWideEditBox:SetText(currentZone[MetaMapNotes_TempData_Id].creator);
        MetaMapNotesEditFrame:Show();
end

function MetaMapNotes_ShowSendFrame(number)
        MetaMapNotesSendPlayer:Enable();
        MetaMapNotesSendParty:Enable();
        MetaMapNotesChangeSendFrame:Enable();
        SendWideEditBox:Show();
        MetaMapNotes_SendFrame_Player:Show();
        if(number == 0) then
                MetaMapNotesDeletePartyNote:Show();
                MetaMapNotes_ToggleSendValue = 2;
        elseif(number == 1) then
                if(MetaMapNotes_PartyNoteSet) then
                        MetaMapNotesDeletePartyNote:Show();
                        MetaMapNotesSendPlayer:Disable();
                        MetaMapNotesChangeSendFrame:Disable();
                        SendWideEditBox:Hide();
                        MetaMapNotes_SendFrame_Player:Hide();
                end
                MetaMapNotesChangeSendFrame:SetText(METAMAPNOTES_SLASHCOMMAND);
                SendWideEditBox:SetText("");
                if(UnitCanCooperate("player", "target")) then
                        SendWideEditBox:SetText(UnitName("target"));
                end
                        MetaMapNotes_SendFrame_Title:SetText(METAMAPNOTES_SEND_NOTE);
                        MetaMapNotes_SendFrame_Tip:SetText(METAMAPNOTES_SEND_TIP);
                        MetaMapNotes_SendFrame_Player:SetText(METAMAPNOTES_SEND_PLAYER);
                        MetaMapNotes_ToggleSendValue = 2;
        elseif(number == 2) then
                MetaMapNotesChangeSendFrame:SetText(METAMAPNOTES_SHOWSEND);
                SendWideEditBox:SetText("/mapnote"..MetaMapNotes_GenerateSendString(2));
                MetaMapNotes_SendFrame_Title:SetText(METAMAPNOTES_SEND_SLASHTITLE);
                MetaMapNotes_SendFrame_Tip:SetText(METAMAPNOTES_SEND_SLASHTIP);
                MetaMapNotes_SendFrame_Player:SetText(METAMAPNOTES_SEND_SLASHCOMMAND);
                MetaMapNotes_ToggleSendValue = 1;
        end
        if(not MetaMapNotesSendFrame:IsVisible()) then
                MetaMapNotes_HideAll();
                MetaMapNotesSendFrame:Show();
        end
end

function MetaMapNotes_Edit_SetIcon(icon)
        MetaMapNotes_TempData_Icon = icon;
        IconOverlay:SetPoint("TOPLEFT", "EditIcon"..icon, "TOPLEFT", -3, 3);
end

function MetaMapNotes_Edit_SetTextColor(color)
        MetaMapNotes_TempData_TextColor = color
        TextColorOverlay:SetPoint("TOPLEFT", "TextColor"..color, "TOPLEFT", -3, 3)
end

function MetaMapNotes_Edit_SetInfo1Color(color)
        MetaMapNotes_TempData_Info1Color = color
        Info1ColorOverlay:SetPoint("TOPLEFT", "Info1Color"..color, "TOPLEFT", -3, 3)
end

function MetaMapNotes_Edit_SetInfo2Color(color)
        MetaMapNotes_TempData_Info2Color = color
        Info2ColorOverlay:SetPoint("TOPLEFT", "Info2Color"..color, "TOPLEFT", -3, 3)
end

function MetaMapNotes_SendNote(type)
        if(type == 1) then
                SendChatMessage(MetaMapNotes_GenerateSendString(1), "WHISPER", this.language, SendWideEditBox:GetText())
                MetaMap_StatusPrint(format(METAMAPNOTES_NOTE_SENT, SendWideEditBox:GetText()), true);
        elseif(type == 2) then
                local name;
                if(GetNumRaidMembers() > 0 ) then
                        for i=1, GetNumRaidMembers(), 1 do
                                name = GetRaidRosterInfo(i);
                                if(name ~= UnitName("player")) then
                                        SendChatMessage(MetaMapNotes_GenerateSendString(1), "WHISPER", this.language, name)
                                end
                        end
                        MetaMap_StatusPrint(METAMAPNOTES_RAIDSENT, true);
                elseif(GetNumPartyMembers() > 0) then
                        for i=1, GetNumPartyMembers(), 1 do
                                name = UnitName("party"..i);
                                if(name ~= UnitName("player")) then
                                        SendChatMessage(MetaMapNotes_GenerateSendString(1), "WHISPER", this.language, name)
                                end
                        end
                        MetaMap_StatusPrint(METAMAPNOTES_PARTYSENT, true);
                else
                        MetaMap_StatusPrint(METAMAPNOTES_NOPARTY, true);
                end
        end
        MetaMapNotes_HideAll()
end

function MetaMapNotes_ClearMiniNote(skipMapUpdate)
        MetaMapNotes_MiniNote_Data = {};
        if(MetaMapNotes_PartyNoteData ~= nil) then
                MetaMapNotes_DeleteNote(-1)
        end
        MiniNotePOI:Hide();
        MetaMapNotesButtonMiniNoteOff:Disable();
        if not skipMapUpdate then
                MetaMapNotes_MapUpdate();
        end
end

function MetaMapNotes_WriteNote()
        MetaMapNotes_HideAll();
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        if(not currentZone) then return; end

        currentZone[MetaMapNotes_TempData_Id] = {};
        currentZone[MetaMapNotes_TempData_Id].name = TitleWideEditBox:GetText();
        currentZone[MetaMapNotes_TempData_Id].ncol = MetaMapNotes_TempData_TextColor;
        currentZone[MetaMapNotes_TempData_Id].inf1 = Info1WideEditBox:GetText();
        currentZone[MetaMapNotes_TempData_Id].in1c = MetaMapNotes_TempData_Info1Color;
        currentZone[MetaMapNotes_TempData_Id].inf2 = Info2WideEditBox:GetText();
        currentZone[MetaMapNotes_TempData_Id].in2c = MetaMapNotes_TempData_Info2Color;
        currentZone[MetaMapNotes_TempData_Id].creator = CreatorWideEditBox:GetText();
        currentZone[MetaMapNotes_TempData_Id].icon = MetaMapNotes_TempData_Icon;
        currentZone[MetaMapNotes_TempData_Id].xPos = MetaMapNotes_TempData_xPos;
        currentZone[MetaMapNotes_TempData_Id].yPos = MetaMapNotes_TempData_yPos;
        if(MetaMapNotes_TempData_LootID ~= nil)then
                currentZone[MetaMapNotes_TempData_Id].lootid = MetaMapNotes_TempData_LootID;
                MetaMapNotes_TempData_LootID = nil;
        end

        if(continent == MetaMapNotes_MiniNote_Data.continent and MetaMapNotes_MiniNote_Data.zone == zone and MetaMapNotes_MiniNote_Data.id == MetaMapNotes_TempData_Id) then
                MetaMapNotes_MiniNote_Data.zonetext = mapName;
                MetaMapNotes_MiniNote_Data.name = TitleWideEditBox:GetText();
                MetaMapNotes_MiniNote_Data.icon = MetaMapNotes_TempData_Icon;
                MiniNotePOITexture:SetTexture(METAMAP_ICON_PATH.."Icon"..MetaMapNotes_MiniNote_Data.icon);
                MetaMapNotes_MiniNote_Data.inf1 = Info1WideEditBox:GetText();
                MetaMapNotes_MiniNote_Data.inf2 = Info2WideEditBox:GetText();
                MetaMapNotes_MiniNote_Data.in1c = MetaMapNotes_TempData_Info1Color;
                MetaMapNotes_MiniNote_Data.in2c = MetaMapNotes_TempData_Info2Color;
                MetaMapNotes_MiniNote_Data.color = MetaMapNotes_TempData_TextColor;
                MetaMapNotes_MiniNote_Data.creator = CreatorWideEditBox:GetText();
        end

        if(MetaMapNotes_vnote_xPos == MetaMapNotes_TempData_xPos and MetaMapNotes_vnote_yPos == MetaMapNotes_TempData_yPos) then
                MetaMapNotes_vnote_xPos = nil;
                MetaMapNotes_vnote_yPos = nil;
        end
        MetaMapNotes_MapUpdate();
end

function MetaMapNotes_MapUpdate()
        if(WorldMapButton:IsVisible() or MetaMapFrame:IsVisible()) then
                MetaMapNotes_WorldMapButton_OnUpdate();
        end
        if(Minimap:IsVisible()) then
                Minimap_OnUpdate(0);
        end
end

function MetaMapNotes_HideAll()
        MetaMapNotesEditFrame:Hide()
        MetaMapNotesSendFrame:Hide()
        MetaMapNotes_QuickNoteFrame:Hide()
        MetaMapNotes_ClearGUI()
end

function MetaMapNotes_FramesHidden()
        if(MetaMapNotesEditFrame:IsVisible() or MetaMapNotesSendFrame:IsVisible()
                        or  MetaMapNotes_QuickNoteFrame:IsVisible()) then
                return false;
        else
                return true;
        end
end

function MetaMapNotes_GetZoneTableSize(zoneTable)
        local i = 0;
        for id in zoneTable do
                i = i + 1;
        end
        return i;
end

function MetaMapNotes_OnEnter(id)
        if MetaMapNotes_FramesHidden() then
                local x, y = this:GetCenter()
                local x2, y2 = WorldMapButton:GetCenter()
                local anchor = ""
                if x > x2 then
                        anchor = "ANCHOR_LEFT"
                else
                        anchor = "ANCHOR_RIGHT"
                end
                WorldMapTooltip:SetOwner(this, anchor)
                if id   == 0 then
                        WorldMapTooltip:SetText(METAMAPNOTES_VNOTE_DEFAULTNAME)
                elseif id       == -1 then
                        WorldMapTooltip:SetText(METAMAPNOTES_PARTYNOTE)
                else
                        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
                        if(not currentZone) then return; end
                        local blt = "";
                        local cNr = currentZone[id].ncol
                        if(currentZone[id].lootid ~= nil and currentZone[id].lootid ~= "") then
                                blt = "|cffff00ffBLT";
                        end
                        WorldMapTooltip:AddDoubleLine(currentZone[id].name, blt, MetaMapNotes_Colors[cNr].r, MetaMapNotes_Colors[cNr].g, MetaMapNotes_Colors[cNr].b, MetaMapOptions.TooltipWrap)
                        if currentZone[id].inf1 ~= nil and currentZone[id].inf1 ~= "" then
                                cNr = currentZone[id].in1c
                                WorldMapTooltip:AddLine(currentZone[id].inf1, MetaMapNotes_Colors[cNr].r, MetaMapNotes_Colors[cNr].g, MetaMapNotes_Colors[cNr].b, MetaMapOptions.TooltipWrap)
                        end
                        if currentZone[id].inf2 ~= nil and currentZone[id].inf2 ~= "" then
                                cNr = currentZone[id].in2c
                                WorldMapTooltip:AddLine(currentZone[id].inf2, MetaMapNotes_Colors[cNr].r, MetaMapNotes_Colors[cNr].g, MetaMapNotes_Colors[cNr].b, MetaMapOptions.TooltipWrap)
                        end
                        if(currentZone[id].creator ~= nil and currentZone[id].creator ~= "" and MetaMapOptions.MetaMapShowAuthor) then
                                WorldMapTooltip:AddDoubleLine(METAMAPNOTES_CREATEDBY, currentZone[id].creator, 0.79, 0.69, 0.0, 0.79, 0.69, 0.0);
                        end
                end
                WorldMapTooltip:Show()
        else
                WorldMapTooltip:Hide()
        end
end

function MetaMapNotes_MiniNote_OnEnter()
        GameTooltip:SetOwner(this, "ANCHOR_CURSOR");
        if(MetaMapNotes_MiniNote_Data.id == -1) then
                GameTooltip:SetText(METAMAPNOTES_PARTYNOTE);
        else
                GameTooltip:SetText(MetaMapNotes_MiniNote_Data.name,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.color].r,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.color].g,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.color].b);

                GameTooltip:AddLine(MetaMapNotes_MiniNote_Data.inf1,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.in1c].r,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.in1c].g,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.in1c].b);

                GameTooltip:AddLine(MetaMapNotes_MiniNote_Data.inf2,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.in2c].r,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.in2c].g,
                MetaMapNotes_Colors[MetaMapNotes_MiniNote_Data.in2c].b);
                if(MetaMapNotes_MiniNote_Data.creator ~= nil and MetaMapNotes_MiniNote_Data.creator ~= "" and MetaMapOptions.MetaMapShowAuthor) then
                        GameTooltip:AddDoubleLine(METAMAPNOTES_CREATEDBY, MetaMapNotes_MiniNote_Data.creator, 0.79, 0.69, 0.0, 0.79, 0.69, 0.0);
                end
        end
        GameTooltip:Show();
end

function MetaMapNotes_Note_OnClick(button, id)
        if(not MetaMapNotes_FramesHidden()) then return; end
        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
        if(not currentZone) then return; end

        if MetaMapNotes_LastLineClick.GUIactive then
                id = id + 0
                local ax = currentZone[id].xPos
                local ay = currentZone[id].yPos
                if (MetaMapNotes_LastLineClick.x ~= ax or MetaMapNotes_LastLineClick.y ~= ay) and MetaMapNotes_LastLineClick.continent == continent and MetaMapNotes_LastLineClick.zone == zone then
                        MetaMapNotes_ToggleLine(continent, zone, ax, ay, MetaMapNotes_LastLineClick.x, MetaMapNotes_LastLineClick.y)
                end
                        MetaMapNotes_ClearGUI()
        elseif(button == "LeftButton" and IsShiftKeyDown()) then
                if (ChatFrameEditBox:IsVisible()) then
                        local mode = 1;
                        if(MetaMapFrame:IsVisible()) then mode = 2; end
                        local tname = currentZone[id].name;
                        local tinf1 = currentZone[id].inf1;
                        local x = MetaMap_round(currentZone[id].xPos *100);
                        local y = MetaMap_round(currentZone[id].yPos *100);
                        local tzone = MetaMap_ZoneNames[continent][zone];
                        if(strlen(tinf1) > 0) then tinf1 = " ["..tinf1.."] "; end
                        local msg = tname.." "..tinf1.." ("..tzone.." - "..x..","..y..")";
                        ChatFrameEditBox:Insert(msg);
                end
        elseif(button == "LeftButton" and IsControlKeyDown()) then
                local LootID = MetaMapNotes_Data[continent][zone][id].lootid;
                local Name = MetaMapNotes_Data[continent][zone][id].name;
                MetaMap_LoadBLT(LootID, Name);
        elseif(button == "LeftButton" and currentZone[id].icon ~= 10) then
                local width = WorldMapButton:GetWidth()
                local height = WorldMapButton:GetHeight()
                id = id + 0
                MetaMapNotes_TempData_Id = id
                local ax = currentZone[id].xPos
                local ay = currentZone[id].yPos
                if ax*1002 >= (1002 - 195) then
                        xOffset = ax * width - 176
                else
                        xOffset = ax * width
                end
                if ay*668 <= (668 - 156) then
                        yOffset = -(ay * height) - 75
                else
                        yOffset = -(ay * height) + 113
                end
                MetaMapNotesButtonSendNote:Enable()
                WorldMapTooltip:Hide()
                MetaMapNotes_OpenEditForExistingNote(MetaMapNotes_TempData_Id)
        elseif(button == "RightButton") then
                if(IsControlKeyDown()) then
                        MetaMapNotes_CRBSelect(id);
                elseif(IsShiftKeyDown()) then
                        MetaMapNotes_SRBSelect(id);
                else
                        MetaMap_LoadBWP(this:GetID(), 2);
                end
        end
end

function MetaMapNotes_StartGUIToggleLine()
        MetaMapNotes_HideAll()
        MetaMapText_NoteTotals:SetText("|cffffffff"..METAMAPNOTES_CLICK_ON_SECOND_NOTE)
        MetaMapNotes_LastLineClick.GUIactive = true
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();

        MetaMapNotes_LastLineClick.x = MetaMapNotes_Data[continent][zone][MetaMapNotes_TempData_Id].xPos
        MetaMapNotes_LastLineClick.y = MetaMapNotes_Data[continent][zone][MetaMapNotes_TempData_Id].yPos
        MetaMapNotes_LastLineClick.zone = zone
        MetaMapNotes_LastLineClick.continent = continent
end

function MetaMapNotes_StartMoveNote(ID)
        MetaMapNotes_HideAll()
        MetaMapText_NoteTotals:SetText("|cffffffff"..METAMAPNOTES_CLICK_ON_LOCATION);
        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
        MetaMapNotes_Relocate.continent = continent;
        MetaMapNotes_Relocate.zone = zone;
        MetaMapNotes_Relocate.id = ID;
end

function MetaMapNotes_MoveNote(continent, zone, id)
        local zoneTable = MetaMapNotes_Lines[continent][zone]
        local lineCount = MetaMapNotes_GetZoneTableSize(zoneTable)
        local currentX = MetaMapNotes_Data[continent][zone][id].xPos;
        local currentY = MetaMapNotes_Data[continent][zone][id].yPos;
        local centerX, centerY = WorldMapButton:GetCenter();
        local width = WorldMapButton:GetWidth();
        local height = WorldMapButton:GetHeight();
        local x, y = GetCursorPosition();
        x = x / WorldMapButton:GetEffectiveScale();
        y = y / WorldMapButton:GetEffectiveScale();
        local adjustedY = (centerY + height/2 - y) / height;
        local adjustedX = (x - (centerX - width/2)) / width;
        MetaMapNotes_Data[continent][zone][id].xPos = adjustedX;
        MetaMapNotes_Data[continent][zone][id].yPos = adjustedY;
        if(MetaMapNotes_MiniNote_Data.id == id) then
                MetaMapNotes_MiniNote_Data.xPos = adjustedX;
                MetaMapNotes_MiniNote_Data.yPos = adjustedY;
        end
        for i = 1, lineCount, 1 do
                if i <= lineCount then
                        if(zoneTable[i].x1 == currentX and zoneTable[i].y1 == currentY) then
                                zoneTable[i].x1 = adjustedX;
                                zoneTable[i].y1 = adjustedY;
                        elseif(zoneTable[i].x2 == currentX and zoneTable[i].y2 == currentY) then
                                zoneTable[i].x2 = adjustedX;
                                zoneTable[i].y2 = adjustedY;
                        end
                end
        end
        MetaMapNotes_MapUpdate();
end

function MetaMapNotes_ClearGUI()
        MetaMapNotes_LastLineClick.GUIactive = false;
        MetaMapNotes_Relocate = {};
end

function MetaMapNotes_DrawLine(id, x1, y1, x2, y2)
        assert(x1 and y1 and x2 and y2)
        local MetaMapNotesLine = MetaMap_CreateLineObject(id);
        local positiveSlopeTexture = METAMAP_IMAGE_PATH.."LineTemplatePositive256"
        local negativeSlopeTexture = METAMAP_IMAGE_PATH.."LineTemplateNegative256"
        local width = WorldMapDetailFrame:GetWidth()
        local height = WorldMapDetailFrame:GetHeight()
        local deltax = math.abs((x1 - x2) * width)
        local deltay = math.abs((y1 - y2) * height)
        local xOffset = math.min(x1,x2) * width
        local yOffset = -(math.min(y1,y2) * height)
        local lowerpixel = math.min(deltax, deltay)
        lowerpixel = lowerpixel / 256
        if lowerpixel > 1 then
                lowerpixel = 1
        end
        if deltax == 0 then
                deltax = 2
                MetaMapNotesLine:SetTexture(0, 0, 0)
                MetaMapNotesLine:SetTexCoord(0, 1, 0, 1)
        elseif deltay == 0 then
                deltay = 2
                MetaMapNotesLine:SetTexture(0, 0, 0)
                MetaMapNotesLine:SetTexCoord(0, 1, 0, 1)
        elseif x1 - x2 < 0 then
                if y1 - y2 < 0 then
                        MetaMapNotesLine:SetTexture(negativeSlopeTexture)
                        MetaMapNotesLine:SetTexCoord(0, lowerpixel, 0, lowerpixel)
                else
                        MetaMapNotesLine:SetTexture(positiveSlopeTexture)
                        MetaMapNotesLine:SetTexCoord(0, lowerpixel, 1-lowerpixel, 1)
                end
        else
                if y1 - y2 < 0 then
                        MetaMapNotesLine:SetTexture(positiveSlopeTexture)
                        MetaMapNotesLine:SetTexCoord(0, lowerpixel, 1-lowerpixel, 1)
                else
                        MetaMapNotesLine:SetTexture(negativeSlopeTexture)
                        MetaMapNotesLine:SetTexCoord(0, lowerpixel, 0, lowerpixel)
                end
        end

        if(MetaMapFrame:IsVisible()) then
                MetaMapNotesLine:SetPoint("TOPLEFT", "MetaMapFrame", "TOPLEFT", xOffset, yOffset)
        else
                MetaMapNotesLine:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", xOffset, yOffset)
        end
        MetaMapNotesLine:SetWidth(deltax)
        MetaMapNotesLine:SetHeight(deltay)
        MetaMapNotesLine:Show()
end

function MetaMapNotes_DeleteLines(continent, zone, x, y)
        local zoneTable = MetaMapNotes_Lines[continent][zone]
        local lineCount = MetaMapNotes_GetZoneTableSize(zoneTable)
        local offset = 0

        for i = 1, lineCount, 1 do
                if (zoneTable[i-offset].x1 == x and zoneTable[i-offset].y1 == y) or (zoneTable[i-offset].x2 == x and zoneTable[i-offset].y2 == y) then
                        for j = i, lineCount-1, 1 do
                                zoneTable[j-offset].x1 = zoneTable[j+1-offset].x1
                                zoneTable[j-offset].x2 = zoneTable[j+1-offset].x2
                                zoneTable[j-offset].y1 = zoneTable[j+1-offset].y1
                                zoneTable[j-offset].y2 = zoneTable[j+1-offset].y2
                        end
                        zoneTable[lineCount-offset] = nil
                        offset = offset + 1
                end
        end
        MetaMapNotes_LastLineClick.zone = 0
end

function MetaMapNotes_ToggleLine(continent, zone, x1, y1, x2, y2)
        local zoneTable = MetaMapNotes_Lines[continent][zone]
        local newline = true
        local lineCount = MetaMapNotes_GetZoneTableSize(zoneTable)

        for i = 1, lineCount, 1 do
                if i <= lineCount then
                        if (zoneTable[i].x1 == x1 and zoneTable[i].y1 == y1 and
                                        zoneTable[i].x2 == x2 and zoneTable[i].y2 == y2) or
                                        (zoneTable[i].x1 == x2 and zoneTable[i].y1 == y2 and
                                        zoneTable[i].x2 == x1 and zoneTable[i].y2 == y1) then
                                for j = i, lineCount-1, 1 do
                                        zoneTable[j].x1 = zoneTable[j+1].x1
                                        zoneTable[j].x2 = zoneTable[j+1].x2
                                        zoneTable[j].y1 = zoneTable[j+1].y1
                                        zoneTable[j].y2 = zoneTable[j+1].y2
                                end
                                zoneTable[lineCount] = nil
                                PlaySound("igMainMenuOption")
                                newline = false
                                lineCount = lineCount - 1
                        end
                end
        end
        if(newline) then
                zoneTable[lineCount+1] = {}
                zoneTable[lineCount+1].x1 = x1
                zoneTable[lineCount+1].x2 = x2
                zoneTable[lineCount+1].y1 = y1
                zoneTable[lineCount+1].y2 = y2
        end
        MetaMapNotes_LastLineClick.zone = 0
        MetaMapNotes_MapUpdate()
end

function MetaMapNotes_NewNoteSlot()
        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
        if(not currentZone) then return 1; end
        return MetaMapNotes_GetZoneTableSize(currentZone) + 1
end

function MetaMapNotes_SetPartyNote(xPos, yPos)
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        xPos = floor(xPos * 1000000) / 1000000
        yPos = floor(yPos * 1000000) / 1000000
        MetaMapNotes_PartyNoteData.continent = continent
        MetaMapNotes_PartyNoteData.zone = zone
        MetaMapNotes_PartyNoteData.xPos = xPos
        MetaMapNotes_PartyNoteData.yPos = yPos
        if MetaMapNotes_MiniNote_Data.icon == "party" or MetaMapOptions.MiniParty then
                MetaMapNotes_MiniNote_Data.zonetext = mapName;
                MetaMapNotes_MiniNote_Data.id = -1;
                MetaMapNotes_MiniNote_Data.continent = continent;
                MetaMapNotes_MiniNote_Data.zone = zone;
                MetaMapNotes_MiniNote_Data.xPos = xPos;
                MetaMapNotes_MiniNote_Data.yPos = yPos;
                MetaMapNotes_MiniNote_Data.name = METAMAPNOTES_PARTYNOTE;
                MetaMapNotes_MiniNote_Data.color = 0;
                MetaMapNotes_MiniNote_Data.icon = "party"
                MiniNotePOITexture:SetTexture(METAMAP_ICON_PATH.."Icon"..MetaMapNotes_MiniNote_Data.icon)
                MiniNotePOI:Show()
        end
        MetaMapNotes_MapUpdate()
end

function MetaMapNotes_WorldMapButton_OnClick(...)
        if(not MetaMapNotes_FramesHidden()) then return; end
        local mouseButton, button = unpack(arg)
        local continent, zone = MetaMap_GetCurrentMapInfo();

        if(MetaMapNotes_Relocate.id ~= nil and zone > 0) then
                if(mouseButton == "LeftButton" and not IsControlKeyDown() and not IsShiftKeyDown()) then
                        MetaMapNotes_MoveNote(MetaMapNotes_Relocate.continent, MetaMapNotes_Relocate.zone, MetaMapNotes_Relocate.id)
                        MetaMapNotes_Relocate = {};
                        return;
                end
        end

        if(MetaMapFrame:IsVisible() and mouseButton == "RightButton") then
                MetaMap_Toggle(false);
                return;
        elseif mouseButton == "RightButton" or (mouseButton == "LeftButton" and not IsControlKeyDown() and not IsShiftKeyDown()) then
                if(MetaMapFrame:IsVisible() and mouseButton == "LeftButton") then
                        return;
                end
                MetaMap_OrigWorldMapButton_OnClick(unpack(arg));
                return;
        else
                if(MetaMapOptions.UseMapMod and not MetaMapFrame:IsVisible() and IsControlKeyDown()) then
                        MetaMap_OrigWorldMapButton_OnClick(unpack(arg));
                        return;
                end
        end

        if(continent == -1 or zone ~= 0 or MetaMapFrame:IsVisible()) then
                if not button then
                        button = this
                end
                local centerX, centerY = button:GetCenter()
                local width = button:GetWidth()
                local height = button:GetHeight()
                local x, y = GetCursorPosition()
                x = x / button:GetEffectiveScale()
                y = y / button:GetEffectiveScale()
                local adjustedY = (centerY + height/2 - y) / height
                local adjustedX = (x - (centerX - width/2)) / width

                if(IsShiftKeyDown()) then
                        MetaMapNotes_SetPartyNote(adjustedX, adjustedY);
                elseif(IsControlKeyDown()) then
                        MetaMapNotes_ShowNewFrame(adjustedX, adjustedY);
                end
        end
end

function MetaMapNotes_WorldMapButton_OnUpdate(...)
        if(MetaMapNotes_Drawing) then
                return;
        end
        local lastNote = 0;
        local lastLine = 0;
        local showLine = true;
        local xOffset,yOffset = 0;
        local currentLineZone;
        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
        MetaMapNotes_Drawing = true;

        if(currentZone) then
                if(continent ==-1) then
                        currentLineZone = MetaMapNotes_Lines[GetRealZoneText];
                else
                        currentLineZone = MetaMapNotes_Lines[continent][zone];
                end
                if(currentLineZone) then
                        for i,line in currentLineZone do
                                MetaMapNotes_DrawLine(i, line.x1, line.y1, line.x2, line.y2)
                                lastLine = i;
                        end
                end
                for i, value in currentZone do
                        local temp = MetaMap_CreateNoteObject(i);
                        local xPos = currentZone[i].xPos;
                        local yPos = currentZone[i].yPos;
                        local xOffset = xPos * WorldMapButton:GetWidth();
                        local yOffset = -yPos * WorldMapButton:GetHeight();
                        if(MetaMapFrame:IsVisible()) then
                                temp:SetParent("MetaMapFrame");
                                temp:SetPoint("CENTER", "MetaMapFrame", "TOPLEFT", xOffset, yOffset)
                        else
                                temp:SetParent("WorldMapButton");
                                temp:SetPoint("CENTER", "WorldMapButton", "TOPLEFT", xOffset, yOffset)
                        end
                        getglobal("MetaMapNotesPOI"..i.."Texture"):SetTexture(METAMAP_ICON_PATH.."Icon"..currentZone[i].icon)
                        getglobal("MetaMapNotesPOI"..i.."Highlight"):Hide();
                        for landmarkIndex = 1, GetNumMapLandmarks(), 1 do
                                local worldMapPOI = getglobal("WorldMapFramePOI"..landmarkIndex);
                                if(worldMapPOI == nil) then break; end
                                local metaMapPOI = getglobal("MetaMapNotesPOI"..i);
                                local name, unknown, textureIndex, x, y = GetMapLandmarkInfo(landmarkIndex);
                                local xPosmin = xPos - 2; local xPosmax = xPos + 2;
                                local yPosmin = yPos - 2; local yPosmax = yPos + 2;
                                if((x > xPosmin and x < xPosmax) and (y > yPosmin and y < yPosmax)) then
                                        metaMapPOI:SetFrameLevel(worldMapPOI:GetFrameLevel() +1);
                                end
                        end
                        if(currentZone[i].icon == 10) then
                                if(currentZone[i].name == MetaMap_FilterName) then
                                        temp:Hide();
                                        showLine = false;
                                else
                                        temp:Show();
                                end
                        elseif(MetaMap_NoteFilter[currentZone[i].icon]) then
                                temp:Show();
                        else
                                MetaMap_FilterName = currentZone[i].name;
                                temp:Hide();
                                showLine = false;
                        end
                        if(not showLine) then
                                for line = 1, lastLine, 1 do
                                        if(currentLineZone[line].x1 == xPos and currentLineZone[line].y1 == yPos) then
                                                getglobal("MetaMapNotesLines_"..line):Hide();
                                        elseif(currentLineZone[line].x2 == xPos and currentLineZone[line].y2 == yPos) then
                                                getglobal("MetaMapNotesLines_"..line):Hide();
                                        end
                                end
                        end
                        lastNote = i;
                        showLine = true;
                end
                if(MetaMapOptions.LastHighlight and lastNote ~= 0 and currentZone[lastNote].icon ~= 10) then
                        if getglobal("MetaMapNotesPOI"..lastNote):IsVisible() then
                                getglobal("MetaMapNotesPOI"..lastNote.."Highlight"):SetTexture(METAMAP_ICON_PATH.."IconGlowRed")
                                getglobal("MetaMapNotesPOI"..lastNote.."Highlight"):Show();
                        end
                end
                if(MetaMapOptions.LastMiniHighlight and MetaMapNotes_MiniNote_Data.continent == continent and
                        MetaMapNotes_MiniNote_Data.zone == zone and MetaMapNotes_MiniNote_Data.id > 0) then
                        getglobal("MetaMapNotesPOI"..MetaMapNotes_MiniNote_Data.id.."Highlight"):SetTexture(METAMAP_ICON_PATH.."IconGlowBlue")
                        getglobal("MetaMapNotesPOI"..MetaMapNotes_MiniNote_Data.id.."Highlight"):Show();
                end
                for i=lastNote+1, MetaMapNotes_LastNote, 1 do
                        getglobal("MetaMapNotesPOI"..i):Hide()
                end
                for i=lastLine+1, MetaMapNotes_LastLine, 1 do
                        getglobal("MetaMapNotesLines_"..i):Hide()
                end
        else
                for i=1, MetaMapNotes_LastNote, 1 do
                        getglobal("MetaMapNotesPOI"..i):Hide();
                end

                for i=1, MetaMapNotes_LastLine, 1 do
                        getglobal("MetaMapNotesLines_"..i):Hide();
                end
        end

        if currentZone then
                -- vNote button
                if MetaMapNotes_vnote_xPos ~= nil and zone ~= 0 then
                        xOffset = MetaMapNotes_vnote_xPos * WorldMapButton:GetWidth();
                        yOffset = -MetaMapNotes_vnote_yPos * WorldMapButton:GetHeight();
                        if(MetaMapFrame:IsVisible()) then
                                MetaMapNotesPOIvNote:SetPoint("CENTER", "MetaMapFrame", "TOPLEFT", xOffset, yOffset)
                        else
                                MetaMapNotesPOIvNote:SetPoint("CENTER", "WorldMapButton", "TOPLEFT", xOffset, yOffset)
                        end
                        MetaMapNotesPOIvNote:Show()
                else
                        MetaMapNotesPOIvNote:Hide()
                end

        -- party note
                if MetaMapNotes_PartyNoteData.xPos ~= nil and zone == MetaMapNotes_PartyNoteData.zone and
                                continent == MetaMapNotes_PartyNoteData.continent then
                        if MetaMapOptions.LastMiniHighlight and MetaMapNotes_MiniNote_Data.icon == "party" then
                                MetaMapNotesPOIpartyTexture:SetTexture(METAMAP_ICON_PATH.."Iconpartyblue")
                        else
                                MetaMapNotesPOIpartyTexture:SetTexture(METAMAP_ICON_PATH.."Iconparty")
                        end
                        xOffset = MetaMapNotes_PartyNoteData.xPos * WorldMapButton:GetWidth();
                        yOffset = -MetaMapNotes_PartyNoteData.yPos * WorldMapButton:GetHeight();
                        if(MetaMapFrame:IsVisible()) then
                                MetaMapNotesPOIparty:SetParent("MetaMapFrame");
                                MetaMapNotesPOIparty:SetPoint("CENTER", "MetaMapFrame", "TOPLEFT", xOffset, yOffset)
                        else
                                MetaMapNotesPOIparty:SetParent("WorldMapButton");
                                MetaMapNotesPOIparty:SetPoint("CENTER", "WorldMapButton", "TOPLEFT", xOffset, yOffset)
                        end
                        MetaMapNotesPOIparty:Show()
                else
                        MetaMapNotesPOIparty:Hide()
                end
        end
        MetaMapNotes_Drawing = nil
        MetaMapText_NoteTotals:SetText("|cff00ff00"..METAMAP_NOTES_SHOWN..": ".."|cffffffff"..(lastNote).."  ".."|cff00ff00"..METAMAP_LINES_SHOWN..": ".."|cffffffff"..(lastLine));

        if(MetaMapOptions.UseMapMod and IsAddOnLoaded("CT_MapMod")) then
                if(MetaMapFrame:IsVisible()) then
                        CT_NumNotes:Hide();
                        MetaMapText_NoteTotals:Show();
                else
                        CT_NumNotes:Show();
                        MetaMapText_NoteTotals:Hide();
                end
        else
                if(IsAddOnLoaded("CT_MapMod")) then
                        CT_NumNotes:Hide();
                end
                MetaMapText_NoteTotals:Show();
        end
        MetaMapList_Init();
        MetaMap_FilterName = "";
end

function MetaMap_DeleteNotesListInit()
        local Temp_List = {};
        for continent, continentTable in MetaMapNotes_Data do
                for zone, zoneTable in continentTable do
                        for index, indexTable in zoneTable do
                                local currentZone = MetaMapNotes_Data[continent][zone][index];
                                if(Temp_List[currentZone.creator] == nil) then
                                        Temp_List[currentZone.creator] = currentZone.creator;
                                end
                        end
                end
        end
        for index, creators in Temp_List do
                local uText;
                if(Temp_List[index] == "") then
                        uText = "Unsigned";
                else
                        uText = Temp_List[index];
                end
                local info = {
                checked = nil;
                notCheckable = 1;
                text = uText;
                func = MetaMap_DeleteNotesList_OnClick;
                };
                UIDropDownMenu_AddButton(info);
        end
        UIDropDownMenu_JustifyText("LEFT", MetaMap_DeleteNotesList)
        UIDropDownMenu_SetText("[Click for Creator]", MetaMap_DeleteNotesList)
end

function MetaMap_DeleteNotesList_OnClick()
        local creator = this:GetText();
        if(creator == "Unsigned") then
                cFlag = "";
        else
                cFlag = creator;
        end     
        UIDropDownMenu_SetSelectedName(MetaMap_DeleteNotesList, this:GetText());
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        StaticPopupDialogs["Delete_Notes"] = {
                text = TEXT(format(METAMAPNOTES_BATCHDELETE, mapName, creator)),
                button1 = TEXT(ACCEPT),
                button2 = TEXT(DECLINE),
                OnAccept = function()
                        MetaMap_DeleteNotes(cFlag, nil, mapName);
                end,
                timeout = 60,
                showAlert = 1,
        };
        StaticPopup_Show("Delete_Notes");
end

function MetaMap_DeleteNotes(creator, name, zoneName)
        if(zoneName == nil or zoneName == "World") then
                assert(creator ~= nil, "ERROR: nil creator passed to DeleteNotesByCreatorAndName!");
                for continent, continentTable in MetaMapNotes_Data do
                        for zone, zoneTable in continentTable do
                                for id=MetaMapNotes_GetZoneTableSize(zoneTable), 1, -1 do
                                        if(zoneTable[id] ~= nil and creator == zoneTable[id].creator and (name == zoneTable[id].name or name == nil)) then
                                                MetaMapNotes_DeleteNote(id, continent, zone)
                                        end
                                end
                        end
                end
        else
                local continent, setZone = MetaMap_NameToZoneID(zoneName, 1);
                if(zoneName == "Kalimdor") then
                        continent = 1;
                elseif(zoneName == "Eastern Kingdoms") then
                        continent = 2;
                end
                for zone, zoneTable in MetaMapNotes_Data[continent] do
                        for id=MetaMapNotes_GetZoneTableSize(zoneTable), 1, -1 do
                                if(setZone == 0 and zoneTable[id] ~= nil and creator == zoneTable[id].creator) then
                                        MetaMapNotes_DeleteNote(id, continent, zone);
                                elseif(setZone == zone and zoneTable[id] ~= nil and creator == zoneTable[id].creator) then
                                        MetaMapNotes_DeleteNote(id, continent, zone);
                                end
                        end
                end
        end
        if(creator == "") then creator = "Unsigned"; end
        if(zoneName ~= nil) then
                if(MetaMap_NotesDialog:IsVisible()) then
                        MetaMapNotes_InfoText:SetText(format(METAMAPNOTES_DELETED_BY_ZONE, zoneName, creator), true);
                        MetaMapNotes_InfoText:Show();
                else
                        MetaMap_StatusPrint(format(METAMAPNOTES_DELETED_BY_ZONE, zoneName, creator), true);
                end
        elseif(name ~= nil) then
                MetaMap_StatusPrint(format(METAMAPNOTES_DELETED_BY_NAME, creator, name), true);
        else
                MetaMap_StatusPrint(format(METAMAPNOTES_DELETED_BY_CREATOR, creator), true);
        end
end

function MetaMap_CheckLinks(id)
        local continent, zone, currentZone = MetaMap_GetCurrentMapInfo();
        local name = currentZone[id].name;
        local count = 0;
        for i=1, 4, 1 do
                if(currentZone[id+i] ~= nil and currentZone[id+i].name == name and currentZone[id+i].icon == 10) then
                        count = count +1;
                end
        end
        for i=1, count +1, 1 do
                MetaMapNotes_DeleteNote(id, continent, zone);
        end
end

function MetaMapNotes_DeleteNote(id, continent, zone)
        MetaMapNotes_HideAll()
        if id == 0 then
                MetaMapNotes_vnote_xPos = nil;
                MetaMapNotes_vnote_yPos = nil;
                MetaMapNotes_MapUpdate();
                return;
        elseif id == -1 then
                MetaMapNotes_PartyNoteData.xPos = nil;
                MetaMapNotes_PartyNoteData.yPos = nil;
                MetaMapNotes_PartyNoteData.continent = nil;
                MetaMapNotes_PartyNoteData.zone = nil;
                if(MetaMapNotes_MiniNote_Data.id == -1) then
                        MetaMapNotes_MiniNote_Data = {};
                end
                MetaMapNotes_MapUpdate();
                return;
        end

        local currentZone
        local TempData = {};
        if(continent == -1 or zone == 0) then
                continent = GetRealZoneText();
                MetaMapNotes_Data[continent][id] = nil;
                MetaMapNotes_MapUpdate();
                return;
        else
                currentZone = MetaMapNotes_Data[continent][zone];
        end
        TempData[continent] = {};
        TempData[continent][zone] = {};
        local lastEntry = MetaMapNotes_GetZoneTableSize(currentZone);

        if(continent ~= -1 and currentZone[id] ~= nil) then
                MetaMapNotes_DeleteLines(continent, zone, currentZone[id].xPos, currentZone[id].yPos);
        end
        if(lastEntry ~= 0 and id <= lastEntry) then
                TempData[continent][zone] = MetaMapNotes_Data[continent][zone];
                MetaMapNotes_Data[continent][zone] = {};
                local newZone = TempData[continent][zone];
                for index, indexTable in newZone do
                        if(index ~= id) then
                                local oldData = newZone[index];
                                MetaMapNotes_AddNewNote(continent, zone, oldData.xPos, oldData.yPos, oldData.name, oldData.inf1, oldData.inf2, oldData.creator, oldData.icon, oldData.ncol, oldData.in1c, oldData.in2c)
                        end
                end
        end

        if continent == MetaMapNotes_MiniNote_Data.continent and zone == MetaMapNotes_MiniNote_Data.zone then
                if MetaMapNotes_MiniNote_Data.id > id then
                        MetaMapNotes_MiniNote_Data.id = MetaMapNotes_MiniNote_Data.id - 1;
                elseif MetaMapNotes_MiniNote_Data.id == id then
                        MetaMapNotes_ClearMiniNote(true);
                end
        end
        MetaMapNotes_MapUpdate();
end

function MetaMapPOI_OnEvent(mode)
        if(GetCurrentMapZone() == 0 or GetCurrentMapContinent() == -1) then return; end
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        local noteAdded1, noteAdded2;
        local name, unknown, textureIndex, x, y;
        local icon = 9;
        for landmarkIndex = 1, GetNumMapLandmarks(), 1 do
                name, unknown, textureIndex, x, y = GetMapLandmarkInfo(landmarkIndex);
                if (textureIndex == 15) then
                        icon = 5;
                elseif (textureIndex == 6) then
                        icon = 6;
                end
                if(mode == 1) then
                        if(textureIndex==6) then
                                noteAdded1 = MetaMapNotes_AddNewNote(continent, zone, x, y, name, "", "", METAMAPFWM_NAME, icon, 6, 0, 0);
                        end
                else
                        noteAdded2 = MetaMapNotes_AddNewNote(continent, zone, x, y, name, "", "", METAMAPFWM_NAME, icon, 6, 0, 0);
                end
        end
        if(noteAdded1 and noteAdded2) then
                MetaMap_StatusPrint("MetaMapPOI updated map notes for "..GetRealZoneText(), true);
        else
                if(noteAdded2) then
                        MetaMap_StatusPrint("MetaMapPOI updated map notes for "..GetRealZoneText(), true);
                end
                if(noteAdded1) then
                        MetaMap_StatusPrint("MetaMapPOI set Guard note for "..name, true);
                end
        end
end

function MetaMap_SortCriteria(a, b)
        if(MetaMap_sortType == METAMAP_SORTBY_NAME) then
                if (a.name < b.name) then
                        return true;
                elseif (a.name > b.name) then
                        return false;
                end
        elseif(MetaMap_sortType == METAMAP_SORTBY_DESC) then
                if (a.desc < b.desc) then
                        return true;
                elseif (a.desc > b.desc) then
                        return false;
                end
        elseif(MetaMap_sortType == METAMAP_SORTBY_LEVEL) then
                if (a.level < b.level) then
                        return true;
                elseif (a.level > b.level) then
                        return false;
                end
        elseif(MetaMap_sortType == METAMAP_SORTBY_LOCATION) then
                if (a.location < b.location) then
                        return true;
                elseif (a.location > b.location) then
                        return false;
                end
        else
                if (a == nil) then
                        if (b == nil) then
                                return false;
                        else
                                return true;
                        end
                elseif (b == nil) then
                        return false;
                end
        end
end

function MetaMap_InvertList(list)
  local newlist = {};
  local count = table.getn(list);
  for i=1,count
  do
    table.insert(newlist, list[(count +1) -i]);
  end
  return newlist;
end

function MetaMap_InfoLine(button)
        if(button == "RightButton") then
                MetaMapOptions.ShowMapList = not MetaMapOptions.ShowMapList;
                MetaMapOptions_Init();
                return;
        end
        if(MetaMap_InfoLineFrame:IsVisible()) then
                MetaMap_InfoLineFrame:Hide();
                MetaMapContainerFrame:Hide();
                return;
        end
        local header, footer, info;
        if(MetaMapFrame:IsVisible()) then
                header = METAMAP_STRING_LOCATION..": ".."|cffffffff"..MetaMap_Data[MetaMapOptions.MetaMapZone]["Location"].."|r";
                header = header.."   "..METAMAP_STRING_LEVELRANGE..": ".."|cffffffff"..MetaMap_Data[MetaMapOptions.MetaMapZone]["LevelRange"].."|r";
                header = header.."   "..METAMAP_STRING_PLAYERLIMIT..": ".."|cffffffff"..MetaMap_Data[MetaMapOptions.MetaMapZone]["PlayerLimit"].."|r";
                MetaMap_InfoLineFrameText:SetText(MetaMap_Data[MetaMapOptions.MetaMapZone].infoline);
        else
                local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
                header = "|cffffffff"..mapName.."|r";
                info = "|cffffffffFurther information may be added at a later date...|r";
                MetaMap_InfoLineFrameText:SetText("|cffffffffFurther information may be added at a later date...|r");
        end
        MetaMapContainer_ShowFrame(MetaMap_InfoLineFrame, header, footer, info);
end

function MetaMap_InfoLineOnEnter()
        WorldMapTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT");
        if(MetaMapFrame:IsVisible()) then
                WorldMapTooltip:SetText(MetaMap_Data[MetaMapOptions.MetaMapZone].ZoneName, 0, 1, 0, false);
                WorldMapTooltip:AddLine(METAMAP_STRING_LOCATION..": ".."|cffffffff"..MetaMap_Data[MetaMapOptions.MetaMapZone]["Location"], 1, 1, 0, false);
                WorldMapTooltip:AddLine(METAMAP_STRING_LEVELRANGE..": ".."|cffffffff"..MetaMap_Data[MetaMapOptions.MetaMapZone]["LevelRange"], 1, 1, 0, false);
                WorldMapTooltip:AddLine(METAMAP_STRING_PLAYERLIMIT..": ".."|cffffffff"..MetaMap_Data[MetaMapOptions.MetaMapZone]["PlayerLimit"], 1, 1, 0, false);
                WorldMapTooltip:AddLine(" ");
                WorldMapTooltip:AddDoubleLine("Saved Instances:", "ID:");
                if(GetNumSavedInstances() > 0) then
                        for i=1, GetNumSavedInstances() do
                                local name, ID, remaining = GetSavedInstanceInfo(i);
                                remaining = SecondsToTime(remaining);
                                WorldMapTooltip:AddDoubleLine(name, "|cffffffff"..ID, 0, 1, 0, false);
                                WorldMapTooltip:AddLine("|cffffffff"..remaining);
                        end
                else
                        WorldMapTooltip:AddLine("|cffffffffNo saved instances");
                end
        else
                local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
                if(type(continent) == "string" or zone == 0) then
                        WorldMapTooltip:SetText(mapName, 1, 1, 0, false);
                else
                        zone = MetaMapNotes_ZoneShift[continent][zone];
                        currentZone = MetaMap_ZoneLevels[continent][zone];
                        local fColor = {}; local lColor = {};
                        local Friendly = { r = 0.2, g = 0.9, b = 0.2 };
                        local Hostile = { r = 0.9, g = 0.2, b = 0.2 };
                        local Contested = { r = 0.8, g = 0.6, b = 0.4 };
                        local fID = currentZone[3];
                        local _, faction = UnitFactionGroup("player");
                        if(fID == "Contested") then
                                fColor = Contested;                             
                        elseif(fID == faction) then
                                fColor = Friendly;
                        else
                                fColor = Hostile;
                        end
                        if(UnitLevel("player") > currentZone[2]) then
                                lColor = { r = 0.5, g = 0.5, b = 0.5 };                         
                        elseif(UnitLevel("player") < currentZone[1]) then
                                lColor = Hostile;
                        else
                                lColor = Friendly;
                        end
                        WorldMapTooltip:AddDoubleLine(mapName, fID, fColor.r, fColor.g, fColor.b, fColor.r, fColor.g, fColor.b, false);
                        WorldMapTooltip:AddDoubleLine(METAMAP_STRING_LEVELRANGE, currentZone[1].." - "..currentZone[2], 1, 1, 0, lColor.r, lColor.g, lColor.b, false);
                end
        end
        WorldMapTooltip:AddLine(" ");
        WorldMapTooltip:AddLine(METAMAP_INFOLINE_HINT1, 0.75, 0, 0.75, false);
        WorldMapTooltip:AddLine(METAMAP_INFOLINE_HINT2, 0.75, 0, 0.75, false);
        WorldMapTooltip:AddLine(" ");
        WorldMapTooltip:AddLine(METAMAPNOTES_WORLDMAP_HELP_1, 0.40, 0.40, 0.40, false);
        WorldMapTooltip:AddLine(METAMAPNOTES_WORLDMAP_HELP_2, 0.40, 0.40, 0.40, false);
        WorldMapTooltip:Show()
end

function MetaKBMenu_RBSelect(id)
        -- Slot assigned to MetaMapBWP.
end

function MetaKBMenu_CRBSelect(id)
        -- Available for other mods to run their own routine.
        -- Initiated when CTRL+RightClicking on KB display item.
        -- Usage: MetaKBMenu_CRBSelect = MyFunction
end

function MetaKBMenu_SRBSelect(id)
        -- Available for other mods to run their own routine.
        -- Initiated when Shift+RightClicking on KB display item.
        -- Usage: MetaKBMenu_SRBSelect = MyFunction
end

function MetaMapNotes_RBSelect(id)
        -- Slot assigned to MetaMapBWP.
end

function MetaMapNotes_CRBSelect(id)
        -- Available for other mods to run their own routine.
        -- Initiated when CTRL+RightClicking on a map note.
        -- Usage: MetaMapNotes_CRBSelect = MyFunction
end

function MetaMapNotes_SRBSelect(id)
        -- Available for other mods to run their own routine.
        -- Initiated when Shift+RightClicking on a map note.
        -- Usage: MetaMapNotes_SRBSelect = MyFunction
end

----------------
-- FuBar Support
----------------
function MetaMap_FuBar_OnLoad()
        local tablet = TabletLib:GetInstance('1.0')
        
        MetaMapFu               = FuBarPlugin:GetInstance("1.2"):new({
        name          = METAMAP_TITLE,
        version       = METAMAP_VERSION,
        description   = METAMAP_DESC,
        aceCompatible = 103,
        category      = "map",
        hasIcon                         = METAMAP_ICON,
        hasNoText               = TRUE,
        })

        function MetaMapFu:OnClick()
                MetaMap_ToggleFrame(WorldMapFrame);
        end
        function MetaMapFu:UpdateTooltip()
                MetaMapMenu_OnShow("FuBar");
        end

        MetaMapFu:RegisterForLoad();
end

----------------
-- Titan Support
----------------
function TitanPanelMetaMapButton_OnLoad()
        this.registry = { 
                id = TITAN_METAMAP_ID,
                version = METAMAP_VERSION,
                menuText = METAMAP_TITLE,
                category = METAMAP_CATEGORY,
                tooltipTitle = METAMAP_TITLE ,
                tooltipTextFunction = "TitanPanelMetaMapButton_GetTooltipText",
                frequency = TITAN_METAMAP_FREQUENCY, 
                icon = METAMAP_ICON,
                iconWidth = 16,
                savedVariables = {
                ShowIcon = 1,
                }
        };
end

function TitanPanelMetaMapButton_GetTooltipText()
        if(MetaMapOptions.MenuMode) then
                retText = METAMAP_BUTTON_TOOLTIP1.."\n"..METAMAP_BUTTON_TOOLTIP2;
                return retText;
        end
end

function TitalPanelMetaMapButton_OnClick(button)
        if ( button == "LeftButton" ) then
                MetaMap_ToggleFrame(WorldMapFrame);
        end
end

---------
-- CT_Mod
---------
if(IsAddOnLoaded("CT_MapMod")) then
        CT_CoordX:Hide();
        CT_CoordY:Hide();
        CT_NumNotes:SetPoint("TOPLEFT","WorldMapDetailFrame","TOPLEFT",10,-10);
        WorldMapFrameCreateNoteOnPlayer:SetPoint("RIGHT","WorldMapContinentDropDown","LEFT",-190,0);
end

-----------
-- FlightMap
-----------
function FlightMapOptions_Toggle()
        FlightMapOptionsFrame:SetFrameStrata("FULLSCREEN");
        MetaMap_ToggleFrame(FlightMapOptionsFrame);
end

-----------
-- Gatherer
-----------
function GathererOptions_Toggle()
        GathererUI_DialogFrame:SetFrameStrata("FULLSCREEN");
        MetaMap_ToggleFrame(GathererUI_DialogFrame);
end

-------------
-- NotesUNeed
-------------
function MetaMap_SetNUNtooltip()
        if(IsAddOnLoaded("NotesUNeed")) then
                local pKey = GetCVar("realmName");
                if(MetaMapOptions.SaveSet == 1) then
                        NuNSettings[pKey].mScale = MetaMapOptions.MetaMapTTScale1;
                else
                        NuNSettings[pKey].mScale = MetaMapOptions.MetaMapTTScale2;
                end
        end
end