vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Declard color codes for console messages
local RED     = "|cffff0000";
local GREEN   = "|cff00ff00";
local BLUE    = "|cff0000ff";
local MAGENTA = "|cffff00ff";
local YELLOW  = "|cffffff00";
local CYAN    = "|cff00ffff";
local WHITE   = "|cffffffff";
local ORANGE  = "|cffffba00";

-----------------------------------
-- global variables
-----------------------------------

known_times = {};
activeTransitName = "";
activeSelect = 1;
activeTransit = -1;


-----------------------------------
-- local variables
-----------------------------------


local vars_loaded = false;
local update_int = 0.8;
local ctime_elapse = 0;
local dataChannel = "ZeppelinMaster";
local Pre_ChatFrame_OnEvent;
local ZSM_version = "1.87";
local protoVersion = "1.7";
local varsVersion = 1.0;
local newVerAvail = false;
local known_times_session = {};
local req_timeout;
local known_times_req = {};
local dropdownvalues = {};
local dropdownindex = {};

local prox = 2;
local debug = false;

function ZSM_OnLoad()
  
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("CHAT_MSG_CHANNEL");
        this:RegisterEvent("ZONE_CHANGED_NEW_AREA");    
        this:RegisterEvent("CHAT_MSG_SYSTEM");  
        this:RegisterEvent("CHAT_MSG_CHANNEL_JOIN");
  this:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE");
  
  -- Register slash command
  SLASH_ZSM1 = "/zsm";
  SLASH_ZSM2 = "/zm";
 
  
  SlashCmdList["ZSM"] = function(msg)
      ZSM_SlashCommandHandler(msg);
  end  
        
  Pre_ChatFrame_OnEvent = ChatFrame_OnEvent;
        ChatFrame_OnEvent = ZSM_ChatFrame_OnEvent;      
        
        Pre_message = message;
        message = ZSM_message;
        --OpenMailFrame
end

function ZSM_message ( message )
                -- Very bad way to supress popup errors, shhhh
                
                if ( string.find(message, "Too many buttons in UIDropDownMenu:") ) then
                                --DEFAULT_CHAT_FRAME:AddMessage("Error Message intercepted: "..message);
                                return;
                else 
                                return Pre_message ( message );
                end             
end

function ZSM_ChatFrame_OnEvent ( event )

                if ((event == "CHAT_MSG_CHANNEL") and (string.lower(arg9) == string.lower(dataChannel))) then
                                -- Silence                              
                                if (debug) then
                                                return Pre_ChatFrame_OnEvent ( event );
                                end
                else                            
                                return Pre_ChatFrame_OnEvent ( event );
                                                                
                end

end

function ZSM_OnUpdate( elapse )         
                
                if (not WorldMapFrame:IsVisible()) then
                                SetMapZoom(0);
                                x,y = GetPlayerMapPosition("player");
                                x = format("%0.3f", x);
                                y = format("%0.3f", y);
                                SetMapToCurrentZone();
                else
                                return;
                end
                
                                                                
                if (req_timeout ~= nil) then
                                req_timeout = req_timeout - elapse;
                                if (req_timeout <= 0) then
                                                local highPlayer = {};
                                                local highTimestamp = {};
                                                local highTime = {};
                                                local tmpTransTimestamps = {};
                                                for playerName,data in known_times_req do
                                                                for transport,transData in data do
                                                                                DEFAULT_CHAT_FRAME:AddMessage(playerName..":"..transport);
                                                                                --DEFAULT_CHAT_FRAME:AddMessage(highTimestamp);
                                                                                
                                                                                if (tmpTransTimestamps[transport] == nil) then
                                                                                                highPlayer[transport] = playerName;
                                                                                                highTimestamp[transport] = transData['timestamp'];
                                                                                                highTime[transport] = transData['time'];
                                                                                elseif (tmpTransTimestamps[transport] > highTimestamp[transport]) then
                                                                                                highPlayer[transport] = playerName;
                                                                                                highTimestamp[transport] = transData['timestamp'];
                                                                                                highTime[transport] = transData['time'];
                                                                                end
                                                                end
                                                end
                                                
                                                -- Highest Timestamp wins
                                                for transport, timestamp in highTimestamp do                                                    
                                                                ZSM_Data[transport] = {};
                                                                ZSM_Data[transport]['timestamp'] = highTimestamp[transport];
                                                                known_times[transport] = highTime[transport];
                                                                req_timeout = nil;
                                                                known_times_req = {};
                                                                
                                                                if (debug) then
                                                                                DEFAULT_CHAT_FRAME:AddMessage("["..highPlayer[transport].."] has most recent transport time:"..highTime[transport]..", with timestamp:".. highTimestamp[transport].." for ".. transport);
                                                                end
                                                end                                     
                                end                             
                end
                

                
                ctime_elapse = ctime_elapse + elapse;           
                if (ctime_elapse > update_int) then
                                ctime_elapse = 0;                                                                       
                                
                                if ((activeTransit ~= -1) and (known_times[activeTransit] ~= nil)) then
                                                local transit = activeTransit;
                                                local cycle = ZSM_CalcTripCycle(transit);
                                                local coord_data = ZSM_GetZepCoords(transit, cycle);
                                                
                                                if (tonumber(coord_data[3]) > 10) then
                                                                --DEFAULT_CHAT_FRAME:AddMessage("Transit:org2gg Cyc:"..cycle_pos['org2gg']);
                                                                        
                                                                for index, data in zsm_data[transit..'_plats'] do                                                                                                                                                               
                                                                                if ((tonumber(x) == data['x']) and (tonumber(y) == data['y'])) then
                                                                                                local depart_time = ZSM_CalcTripCycleTime(transit,cycle) - (cycle*zsm_data[transit..'_time']) - data['adj'] ;
                                                                                                --DEFAULT_CHAT_FRAME:AddMessage("At platform:".. data['name'].." depart time:"..depart_time);                           
                                                                                                if ((depart_time < 10) and (depart_time >= 0)) then
                                                                                                                --SendChatMessage("Departure Time: ".. format("%0.0f", depart_time) .." sec.", "SAY");                          
                                                                                                end
                                                                                end
                                                                end                                                                                                                                                                     
                                                end

                                                for index, data in zsm_data[transit..'_plats'] do
                                                                --ZSM_CalcTripCycleTime(transit,cycle)                                                          
                                                                --DEFAULT_CHAT_FRAME:AddMessage(data['name']..":"..ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1));                                                                                                                                                              
                                                                local arrival_time = 0;
                                                                if (ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1) > (cycle*zsm_data[transit..'_time'])) then
                                                                                arrival_time = ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1) - (cycle*zsm_data[transit..'_time']);
                                                                                --DEFAULT_CHAT_FRAME:AddMessage("Arrival Time of "..data['name']..": "..arrival_time .." sec.");                                                                                
                                                                else
                                                                                arrival_time = zsm_data[transit..'_time'] - (cycle*zsm_data[transit..'_time']);
                                                                                arrival_time = arrival_time + ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1);
                                                                                --DEFAULT_CHAT_FRAME:AddMessage("Arrival Time of "..data['name']..": "..arrival_time .." sec.");
                                                                end 
                                                                --DEFAULT_CHAT_FRAME:AddMessage(GetRealZoneText());
                                                                                                                                
                                                                local platname;
                                                                if (ZSM_Data['Opts']['CityAlias']) then
                                                                                platname = data['alias'];
                                                                else
                                                                                platname = data['name'];
                                                                end                                                                                                                             
                                                                getglobal("ZSMFramePlat"..(index+1).."Name"):SetText(platname);                                                         
                                                                
                                                                local coord_data = ZSM_GetZepCoords(transit, cycle);
                                                                local depart_time = ZSM_CalcTripCycleTime(transit,cycle) - (cycle*zsm_data[transit..'_time']) - data['adj'];
                                                                
                                                                local formated_depart_time = "";
                                                                if (depart_time > 59) then
                                                                                local time_min = format("%0.0f",math.floor(depart_time/60));
                                                                                local time_sec = format("%0.0f",depart_time-(math.floor(depart_time/60)*60));
                                                                                formated_depart_time = time_min.."m, "..time_sec.."s";
                                                                else
                                                                                formated_depart_time = format("%0.0f",depart_time).."s";
                                                                end                             

                                                                local formated_arrival_time = "";
                                                                if (arrival_time > 59) then
                                                                                local time_min = format("%0.0f",math.floor(arrival_time/60));
                                                                                local time_sec = format("%0.0f",arrival_time-(math.floor(arrival_time/60)*60));
                                                                                formated_arrival_time = time_min.."m, "..time_sec.."s";
                                                                else
                                                                                formated_arrival_time = format("%0.0f",arrival_time).."s";
                                                                end                                                                                                                     
                                                                
                                                                if ((data['x'] == tonumber(coord_data[1])) and (data['y'] == tonumber(coord_data[2])) and (depart_time > 0)) then                                       
                                                                                local color;
                                                                                if (depart_time > 30) then
                                                                                                color = YELLOW;
                                                                                else
                                                                                                color = RED;
                                                                                end
                                                                                getglobal("ZSMFramePlat"..(index+1).."ArrivalDepature"):SetText(color.."Dep: ".. formated_depart_time);
                                                                else 
                                                                                local color = GREEN;                                                                            
                                                                                getglobal("ZSMFramePlat"..(index+1).."ArrivalDepature"):SetText(color.."Arr: ".. formated_arrival_time);
                                                                end
                                                                        
                                                                
                                                                if (floor((floor(arrival_time) / 10)) == (floor(arrival_time) / 10)) then
                                                                                if (arrival_time < 60) then
                                                                                                
                                                                                                if ((floor(arrival_time) == 20) or (floor(arrival_time) == 21)) then
                                                                                                                        --SendChatMessage("Want to know arrival departure times of any Zeppelin/Ship/Tram in Azeroth on GUI?","SAY");
                                                                                                                        --SendChatMessage("Visit curse-gaming.com and download addon called ZeppelinMaster :)","SAY");
                                                                                                else
                                                                                                                        --SendChatMessage("Arrival Time in "..data['name']..": "..format("%0.0f", arrival_time) .." sec.", "SAY");
                                                                                                end
                                                                                end
                                                                end
                                                                        
                                                end             
                                elseif ((activeTransit ~= -1) and (known_times[activeTransit] == nil)) then                                     
                                                local transit = activeTransit;
                                                for index, data in zsm_data[transit..'_plats'] do
                                                                
                                                                local platname;
                                                                if (ZSM_Data['Opts']['CityAlias']) then
                                                                                platname = data['alias'];
                                                                else
                                                                                platname = data['name'];
                                                                end
                                                        
                                                                getglobal("ZSMFramePlat"..(index+1).."Name"):SetText(platname);
                                                                getglobal("ZSMFramePlat"..(index+1).."ArrivalDepature"):SetText("-- N/A --");                                   
                                                end
                                elseif (activeTransit == -1) then
                                                for index = 1, 2 do
                                                                getglobal("ZSMFramePlat"..(index).."Name"):SetText(ZSM_STR_NONESELECT);
                                                                getglobal("ZSMFramePlat"..(index).."ArrivalDepature"):SetText("-- N/A --");                             
                                                end
                                end                             
                end                                             

                if (ZSM_ProxyCheck(x,'0.315',prox) and ZSM_ProxyCheck(y,'0.450',prox) and (not known_times_session['org2uc'])) then
                                ZSM_SetKnownTime(25, 'org2uc');
                                known_times_session['org2uc'] = true;
                elseif (ZSM_ProxyCheck(x,'0.725',prox) and ZSM_ProxyCheck(y,'0.227',prox) and (not known_times_session['org2uc'])) then
                                ZSM_SetKnownTime(131, 'org2uc');
                                known_times_session['org2uc'] = true;
                elseif (ZSM_ProxyCheck(x,'0.311',prox) and ZSM_ProxyCheck(y,'0.443',prox) and (not known_times_session['org2gg'])) then                         
                                ZSM_SetKnownTime(16, 'org2gg');
                                known_times_session['org2gg'] = true;
                elseif (ZSM_ProxyCheck(x,'0.717',prox) and ZSM_ProxyCheck(y,'0.759',prox) and (not known_times_session['org2gg'])) then                         
                                ZSM_SetKnownTime(63, 'org2gg'); 
                                known_times_session['org2gg'] = true;   
                elseif (ZSM_ProxyCheck(x,'0.741',prox) and ZSM_ProxyCheck(y,'0.723',prox) and (not known_times_session['grom2uc'])) then
                                ZSM_SetKnownTime(42 ,'grom2uc');
                                known_times_session['grom2uc'] = true;
                elseif (ZSM_ProxyCheck(x,'0.711',prox) and ZSM_ProxyCheck(y,'0.747',prox) and (not known_times_session['grom2uc'])) then
                                ZSM_SetKnownTime(118 ,'grom2uc');
                                known_times_session['grom2uc'] = true;
                elseif (ZSM_ProxyCheck(x,'0.712',prox) and ZSM_ProxyCheck(y,'0.811',prox) and (not known_times_session['ratch2bb'])) then
                                ZSM_SetKnownTime(93, 'ratch2bb');
                                known_times_session['ratch2bb'] = true;
                elseif (ZSM_ProxyCheck(x,'0.285',prox) and ZSM_ProxyCheck(y,'0.532',prox) and (not known_times_session['ratch2bb'])) then
                                ZSM_SetKnownTime(162, 'ratch2bb');
                                known_times_session['mh2bb'] = true;            
                elseif (ZSM_ProxyCheck(x,'0.740',prox) and ZSM_ProxyCheck(y,'0.436',prox) and (not known_times_session['mh2aub'])) then
                                ZSM_SetKnownTime(30, 'mh2aub');
                                known_times_session['mh2aub'] = true;           
                elseif (ZSM_ProxyCheck(x,'0.170',prox) and ZSM_ProxyCheck(y,'0.288',prox) and (not known_times_session['mh2aub'])) then
                                ZSM_SetKnownTime(84, 'mh2aub');
                                known_times_session['mh2ds'] = true;            
                elseif (ZSM_ProxyCheck(x,'0.734',prox) and ZSM_ProxyCheck(y,'0.464',prox) and (not known_times_session['mh2thera'])) then
                                ZSM_SetKnownTime(21, 'mh2thera');
                                known_times_session['mh2thera'] = true;         
                elseif (ZSM_ProxyCheck(x,'0.312',prox) and ZSM_ProxyCheck(y,'0.620',prox) and (not known_times_session['mh2thera'])) then
                                ZSM_SetKnownTime(83, 'mh2thera');
                                known_times_session['mh2thera'] = true;                                                 
                elseif (ZSM_ProxyCheck(x,'0.171',prox) and ZSM_ProxyCheck(y,'0.252',prox) and (not known_times_session['rtv2ds'])) then
                                ZSM_SetKnownTime(28, 'rtv2ds'); 
                                known_times_session['rtv2ds'] = true;                                   
                elseif (ZSM_ProxyCheck(x,'0.180',prox) and ZSM_ProxyCheck(y,'0.221',prox) and (not known_times_session['rtv2ds'])) then
                                ZSM_SetKnownTime(94, 'rtv2ds'); 
                                known_times_session['rtv2ds'] = true;                                   
                end                     
                                                                                                                
end

function ZSM_ProxyCheck(curpos, checkpos, prox) 
                for i=0, prox do
                                --DEFAULT_CHAT_FRAME:AddMessage("Checking loc:"..curpos.." for desired loc:"..checkpos);
                                if ((tonumber(curpos)-(i*0.001)) == tonumber(checkpos)) then
                                        return true;
                                elseif ((tonumber(curpos)+(i*0.001)) == tonumber(checkpos)) then
                                        return true;
                                end
                end
                return false;
end

function ZSM_CalcTripCycleTimeByIndex(transit, index) 
                local sum_time = 0;
                for i = 1, index do                                             
                                local Args = GetArgs(zsm_data[transit..'_data'][i], ":");
                                sum_time = sum_time + tonumber(Args[3]);
                end
                return sum_time;
end

function ZSM_CalcTripCycle(transit) 
                local div_time = GetTime() - known_times[transit];
                div_time = div_time / zsm_data[transit..'_time'];
                div_time = div_time - floor(div_time);
                return div_time;
end

function ZSM_CalcTripCycleTime(transit, cycle) 
                local sum_time = 0;
                for i = 1, table.getn(zsm_data[transit..'_data']) do                                            
                                local Args = GetArgs(zsm_data[transit..'_data'][i], ":");                               
                                sum_time = sum_time + tonumber(Args[3]);                                                
                                if ((cycle*zsm_data[transit..'_time']) <= sum_time) then
                                         return sum_time;
                                end
                end
end

function ZSM_GetZepCoords(transit, cycle)
                local sum_time = 0;
                for i = 1, table.getn(zsm_data[transit..'_data']) do            
                                local Args = GetArgs(zsm_data[transit..'_data'][i], ":");
                                sum_time = sum_time + tonumber(Args[3]);
                                if ((cycle*zsm_data[transit..'_time']) <= sum_time) then                                                        
                                                return Args;
                                end
                end
end

function ZSM_SetKnownTime( value, transit )
                                
                local sum_time = 0;
                for i = 1, value do             
                                local Args = GetArgs(zsm_data[transit..'_data'][i], ":");
                                sum_time = sum_time + Args[3];
                end
                known_times[transit] = GetTime() - sum_time;            
                known_times['uptime'] = GetTime();              
                
                if (debug) then
                                DEFAULT_CHAT_FRAME:AddMessage(transit .." Zep Time Set :"..known_times[transit]);
                end
                
                ZSM_Data[transit] = {};
                ZSM_Data[transit]['timestamp'] = time();
                local id, name = GetChannelName(dataChannel);   
                SendChatMessage('KNOWN:'..protoVersion..":"..transit..":"..value, "CHANNEL", nil, id);                          

end

-------------------

-- DB Drop Down
function ZSM_TransportSelect_Initialize()
        local info;             
        dropdownvalues = {};
        
        for i = 0, getn(zsm_data['transports']), 1 do
                dropdownindex[zsm_data['transports'][i]['label']] = i;
                
                local textdesc; 
                if (ZSM_Data['Opts']['CityAlias']) then
                                if (known_times[zsm_data['transports'][i]['label']]) then
                                        textdesc = GREEN..zsm_data['transports'][i]['namealias'];
                                else
                                        textdesc = zsm_data['transports'][i]['namealias'];
                                end
                else
                                if (known_times[zsm_data['transports'][i]['label']]) then
                                        textdesc = GREEN .. zsm_data['transports'][i]['name'];
                                else
                                        textdesc = zsm_data['transports'][i]['name'];
                                end
                end
                                
                info = {
                        text = textdesc;
                        func = ZSM_TransportSelect_OnClick;
                };       
                
                local addtrans = false;
                if (ZSM_Data['Opts']['FactionSpecific']) then
                                local faction = UnitFactionGroup("player");
                                if ((zsm_data['transports'][i]['faction'] == faction) or (zsm_data['transports'][i]['faction'] == "Nuetral")) then
                                                addtrans = true;
                                end                             
                else
                                addtrans = true;
                end
                
                if (ZSM_Data['Opts']['ZoneSpecific'] and (addtrans)) then
                                local zonestr = string.lower(zsm_data['transports'][i]['name']);
                                local czonestr = string.lower(GetRealZoneText());
                                if (not string.find(zonestr, czonestr)) then
                                                addtrans = false;
                                end     
                end
                
                if ((addtrans) or (zsm_data['transports'][i]['faction'] == -1)) then
                                UIDropDownMenu_AddButton(info);                                                         
                                table.insert(dropdownvalues, zsm_data['transports'][i]['label']);
                end
        end
                
                
end


-- DB Drop Down
function ZSM_TransportSelect_PreInitialize()
        local info;             
        
        info = {
                text = 'loading variables';
                func = ZSM_TransportSelect_OnClick;
        };                              
        UIDropDownMenu_AddButton(info);
end

function ZSM_TransportSelect_OnShow()

        if (vars_loaded) then
                        ZSM_TransportSelect_OnLoaded();
                        UIDropDownMenu_SetWidth(150);
                        return;
        end
        
        UIDropDownMenu_ClearAll(ZSMFrameTransportSelect);
        UIDropDownMenu_Initialize(ZSMFrameTransportSelect, ZSM_TransportSelect_PreInitialize);
        UIDropDownMenu_SetSelectedID(ZSMFrameTransportSelect, 1);
        UIDropDownMenu_SetWidth(150);
end
         
function ZSM_TransportSelect_OnLoaded() 
        UIDropDownMenu_ClearAll(ZSMFrameTransportSelect);
        UIDropDownMenu_Initialize(ZSMFrameTransportSelect, ZSM_TransportSelect_Initialize);
        UIDropDownMenu_SetSelectedID(ZSMFrameTransportSelect, activeSelect);
        
end

function ZSM_TransportSelect_OnClick()
        if (req_timeout ~= nil) then
                        -- Can't change selection while data request is in process
                        return;
        end
        
        i = this:GetID();
        UIDropDownMenu_SetSelectedID(ZSMFrameTransportSelect, i);
        activeTransit = dropdownvalues[i];      
        activeSelect = i;
        if (ZSM_Data['Opts']['CityAlias']) then 
                        activeTransitName = zsm_data['transports'][dropdownindex[activeTransit]]['namealias'];
        else
                        activeTransitName = zsm_data['transports'][dropdownindex[activeTransit]]['name'];
        end
        
        if (known_times[activeTransit] == nil) then
                        local id, name = GetChannelName(dataChannel);   
                        SendChatMessage('REQ:'..protoVersion..":"..activeTransit, "CHANNEL", nil, id);                  
        end
end

function ZSM_TransportRequestData(transport)    
        
                local id, name = GetChannelName(dataChannel);   
                SendChatMessage('REQ:'..protoVersion..":"..transport, "CHANNEL", nil, id);                      
                
                if (debug) then
                                DEFAULT_CHAT_FRAME:AddMessage("Data requested for transport ".. transport);
                end

end

-----------------

function ZSM_Minimize_OnClick ()

                        if( not ZSMFrame:IsVisible() )then
                                        ZSMFrame:Show();
                                        ZSMHeaderFrameMinimizeButton:SetText("v");
                                        ZSM_Data['Opts']['ShowLowerGUI'] = true;
                        else
                                        ZSMFrame:Hide();
                                        ZSMHeaderFrameMinimizeButton:SetText("^");
                                        ZSM_Data['Opts']['ShowLowerGUI'] = false;
                        end

end

function ZSM_Close_OnClick ()
                ZSMHeaderFrame:Hide();
                ZSM_Data['Opts']['ShowGUI'] = false;
                DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster -- GUI Closed! ("..GREEN.."Type /zm to show again"..YELLOW..")");
end

function ZSM_Options_OnClick ()

                        if( not ZSMOptionsFrame:IsVisible() )then
                                        ZSMOptionsFrame:Show();
                                        
                        else
                                        ZSMOptionsFrame:Hide();
                        end

end

function ZSM_OptionsSave_OnClick ()
        
                ZSM_Data['Opts']['ZoneGUI'] = ZSMOptionsFrameOptZoneGUI:GetChecked();
                ZSM_Data['Opts']['FactionSpecific'] = ZSMOptionsFrameOptFactionSpecific:GetChecked();
                ZSM_Data['Opts']['ZoneSpecific'] = ZSMOptionsFrameOptZoneSpecific:GetChecked();
                ZSM_Data['Opts']['CityAlias'] = ZSMOptionsFrameOptCityAlias:GetChecked();
                
                -- Refresh Dropdown with current options applied
                ZSM_TransportSelect_OnLoaded();
                
                
                --DEFAULT_CHAT_FRAME:AddMessage(OptCityAlias);
                
                
                ZSMOptionsFrame:Hide();

end

function ZSM_OptionsClose_OnClick ()
                if (ZSM_Data['Opts']['ZoneGUI']) then
                                ZSMOptionsFrameOptZoneGUI:SetChecked();
                end     
                if (ZSM_Data['Opts']['FactionSpecific']) then
                                ZSMOptionsFrameOptFactionSpecific:SetChecked();
                end
                if (ZSM_Data['Opts']['ZoneSpecific']) then
                                ZSMOptionsFrameOptZoneSpecific:SetChecked();
                end
                if (ZSM_Data['Opts']['CityAlias']) then
                                ZSMOptionsFrameOptCityAlias:SetChecked();
                end                                                                                                                             
                ZSMOptionsFrame:Hide();
end

-----------------

function ZSM_OnEvent( event )

                if (event == "VARIABLES_LOADED") then
                                vars_loaded = true;

                                -- Initialize Saved Variables
                                if (ZSM_Opts == nil) then
                                                ZSM_Opts = {};
                                end                                                                                                                                     
                                                
                                if (ZSM_Opts['dataChannel'] == nil) then
                                                ZSM_Opts['dataChannel'] = dataChannel;                                  
                                end
                                if (ZSM_Data == nil) then
                                                ZSM_Data = {};
                                                known_times = {};
                                end
                                if (ZSM_Data['protoVersion'] == nil) then
                                                ZSM_Data['protoVersion'] = protoVersion;
                                end
                                if (ZSM_Data['protoVersion'] ~= protoVersion) then
                                                -- If protocol is different, reset data
                                                known_times = {};
                                                ZSM_Data['protoVersion'] = protoVersion;
                                                
                                                if (debug) then
                                                                DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster - DEBUG - ".. RED .."Protocol changed, data reset!!");
                                                end
                                end
                                if (ZSM_Data['Opts'] == nil) then
                                                ZSM_Data['Opts'] = {};
                                                ZSM_Data['Opts']['ZoneGUI'] = false;
                                                ZSM_Data['Opts']['FactionSpecific'] = true;
                                                ZSM_Data['Opts']['ZoneSpecific'] = false;
                                                ZSM_Data['Opts']['CityAlias'] = true;                                           
                                end
                                
                                if ((ZSM_Data['Opts']['version'] == nil) or (ZSM_Data['Opts']['version'] < varsVersion)) then
                                                ZSM_Data['Opts']['version'] = varsVersion;
                                                ZSM_Data['Opts']['ZoneGUI'] = false;
                                end
                                
                                if (ZSM_Data['Opts']['ShowGUI'] == nil) then
                                                ZSM_Data['Opts']['ShowGUI'] = true;
                                end
                                
                                if (ZSM_Data['Opts']['ShowLowerGUI'] == nil) then
                                                ZSM_Data['Opts']['ShowLowerGUI'] = true;
                                end                             
                                
                                -- Set GUI Options
                                if (ZSM_Data['Opts']['ZoneGUI']) then
                                                ZSMOptionsFrameOptZoneGUI:SetChecked();
                                end     
                                if (ZSM_Data['Opts']['FactionSpecific']) then
                                                ZSMOptionsFrameOptFactionSpecific:SetChecked();
                                end
                                if (ZSM_Data['Opts']['ZoneSpecific']) then
                                                ZSMOptionsFrameOptZoneSpecific:SetChecked();
                                end
                                if (ZSM_Data['Opts']['CityAlias']) then
                                                ZSMOptionsFrameOptCityAlias:SetChecked();
                                end                                             
                                
                                ZSM_TransportSelect_OnLoaded();
                                --                                                                                                              
                                
                                dataChannel = ZSM_Opts['dataChannel'];
                                
                                if (ZSM_Data['Opts']['ShowLowerGUI']) then
                                                ZSMFrame:Show();
                                else
                                                ZSMFrame:Hide();
                                end
                                
                                if (ZSM_Data['Opts']['ShowGUI']) then
                                                ZSMHeaderFrame:Show();
                                else
                                                ZSMHeaderFrame:Hide();
                                end
                                
                                if ((ZSM_Data['agedTimestamp'] ~= nil) and (ZSM_Data['agedTimestamp'] > time())) then
                                                ZSM_Data['agedTimestamp'] = time();
                                                DEFAULT_CHAT_FRAME:AddMessage("ZeppelinMaster: Aged timestamp was too old, setting oldest timestamp to current system time.");
                                end
                                
                                --ZSMHeaderFrameAddonName:SetText("ZeppelinMaster "..ZSM_version);
                                ZSMOptionsFrameOptionsTitle:SetText("ZeppelinMaster Options (v"..ZSM_version..")");
                                DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster v"..ZSM_version.." -- Loaded. (type /zsm to toggle interface)");
                                if ((known_times['uptime'] ~= nil) and (known_times['uptime'] > GetTime())) then
                                                -- Since uptime is less than last known zep time, reset must have occured
                                                -- Clear known times
                                                known_times = {};
                                                known_times['uptime'] = GetTime();
                                                
                                                DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster -- ".. RED .."Sync Data Out-Of-Date ... Data Reset!");
                                end                                             
                                
                elseif (event == "CHAT_MSG_SYSTEM") then
                                if (string.find(string.lower(arg1), "restart in") or string.find(string.lower(arg1), "shutdown in")) then
                                                -- Server is going down, clear zeppelin times also record down time server went down so we can
                                                -- inform other clients that their data is out of date if their data timestamp is less than 
                                                -- server reset.
                                                
                                                known_times = {};                                                                               
                                                ZSM_Data['agedTimestamp'] = time();
                                end
                elseif ((event == "CHAT_MSG_CHANNEL_NOTICE")) then
                                joinedch = true;
                                -- Automatically join data channel
                                JoinChannelByName(dataChannel);
                                
                                if (arg9 == dataChannel) then
                                                local id, name = GetChannelName(dataChannel);
                                                SendChatMessage('REQVER:1:1', "CHANNEL", nil, id);

                                                -- Transmit all our known data when someone joins a channel
                                                for index, data in zsm_data['transports'] do
                                                                
                                                                if (data['label'] ~= -1) then
                                                                                ZSM_TransportRequestData(data['label']);
                                                                end
                                                end                                             
                                end
                                
                                
                elseif (event == "CHAT_MSG_CHANNEL_JOIN") then
                                -- if our client was around for a server shutdown or restart, let other clients know data before this date is out-of-date
                                if ((ZSM_Data['agedTimestamp'] ~= nil) and (string.lower(arg9) == string.lower(dataChannel))) then                                      
                                                local id, name = GetChannelName(dataChannel);
                                                SendChatMessage('DATED:'..protoVersion..":"..ZSM_Data['agedTimestamp'], "CHANNEL", nil, id);
                                end                             
                                
                elseif ((event == "CHAT_MSG_CHANNEL") and (arg9 == dataChannel) and (arg2 ~= UnitName("player"))) then
                                                                                                
                                local Args = GetArgs(arg1, ":");
                                local numArgs = table.getn(Args);
                                
                                if (numArgs <= 2) then
                                                return;
                                end
                                
                                local command = Args[1];                                
                                local version = Args[2];
                                                                                                
                                --DEFAULT_CHAT_FRAME:AddMessage(arg4..":"..arg2..":"..arg1);
                                
                                if ((tonumber(protoVersion) < tonumber(version)) and (not newVerAvail)) then
                                                newVerAvail = true;
                                                DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster ::".. RED .." There is a new version of ZeppelinMaster available at curse-gaming.com!");
                                                return;
                                end                             
                                
                                if (command == "REQVER") then   
                                                local id, name = GetChannelName(dataChannel);                                                                   
                                                SendChatMessage('VER:'..protoVersion..":"..ZSM_version, "CHANNEL", nil, id);                    
                                elseif (command == "VER") then
                                                local clientversion = Args[3];
                                                
                                                if ((tonumber(ZSM_version) < tonumber(clientversion)) and (not newVerAvail)) then
                                                                newVerAvail = true;
                                                                DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster ::".. RED .." There is a new version of ZeppelinMaster available at curse-gaming.com!");
                                                                return;
                                                end                                                                     
                                elseif ((command == "DATED") and (protoVersion == version)) then                                                
                                                local dated_timestamp = tonumber(Args[3]);
                                                if ((ZSM_Data['agedTimestamp'] ~= nil) and (ZSM_Data['agedTimestamp'] < dated_timestamp) and (dated_timestamp < time()))  then
                                                                ZSM_Data['agedTimestamp'] = dated_timestamp;
                                                elseif ((ZSM_Data['agedTimestamp'] == nil) and (dated_timestamp < time())) then
                                                                ZSM_Data['agedTimestamp'] = dated_timestamp;
                                                end
                                                
                                                -- Check to see any of this clients data is older than last aged timestamp
                                                -- if so clear it
                                                for transport, time in known_times do
                                                        
                                                                if ((ZSM_Data[transport] ~= nil) and (ZSM_Data[transport]['timestamp'] ~= nil) and (ZSM_Data['agedTimestamp'] ~= nil) and (ZSM_Data[transport]['timestamp'] < ZSM_Data['agedTimestamp'])) then
                                                                                known_times[transport] = nil;
                                                                                ZSM_Data[transport] = nil;              
                                                                                
                                                                                if (debug) then
                                                                                                DEFAULT_CHAT_FRAME:AddMessage(transport.." timestamp is too old, removing.");
                                                                                end                                                     
                                                                end
                                                end                                             
                                        
                                elseif ((command == "KNOWN") and (protoVersion == version)) then
                                                local transit = Args[3];                                
                                                local value = tonumber(Args[4]);
                                                
                                                local sum_time = 0;
                                                for i = 1, value do             
                                                                local Args = GetArgs(zsm_data[transit..'_data'][i], ":");
                                                                sum_time = sum_time + Args[3];
                                                end
                                                
                                                known_times[transit] = GetTime() - sum_time;            
                                                ZSM_Data[transit] = {};
                                                ZSM_Data[transit]['timestamp'] = time();
                                                
                                                if (debug) then
                                                                DEFAULT_CHAT_FRAME:AddMessage(RED.."Zep Time Broadcast Received from ".. arg2 .." -- ".. transit .." Zep Time Set :"..known_times[transit]);
                                                end
                                elseif ((command == "REQ") and (protoVersion == version)) then
                                                local transit = Args[3];
                                                
                                                if (debug) then
                                                                DEFAULT_CHAT_FRAME:AddMessage(arg2.." requested ".. transit);
                                                end                                                     
                                                
                                                if (known_times[transit] ~= nil) then
                                                                local cycle = ZSM_CalcTripCycle(transit);
                                                                local time = cycle*zsm_data[transit..'_time'];
                                                                local id, name = GetChannelName(dataChannel);                                                                   
                                                                SendChatMessage('RESP:'..protoVersion..":"..transit..":"..time..":"..ZSM_Data[transit]['timestamp'], "CHANNEL", nil, id);
                                                                
                                                                if (debug) then
                                                                                DEFAULT_CHAT_FRAME:AddMessage(dataChannel.." -- ".. id);
                                                                end
                                                end
                                                
                                        
                                elseif ((command == "RESP") and (protoVersion == version)) then
                                                local transit = Args[3];
                                                local time = tonumber(Args[4]);
                                                local timestamp = tonumber(Args[5]);
                                                
                                                if (known_times[transit] == nil) then
                                                                req_timeout = 1;                                                                
                                                                if (known_times_req[arg2] == nil) then
                                                                                known_times_req[arg2] = {};
                                                                end
                                                                known_times_req[arg2][transit] = {};
                                                                known_times_req[arg2][transit]['timestamp'] = timestamp;
                                                                known_times_req[arg2][transit]['time'] = GetTime() - time;                                                              
                                                                                                                                
                                                                if (debug) then
                                                                                DEFAULT_CHAT_FRAME:AddMessage(RED.."Zep Time Brocast Received from ".. arg2 .." -- ".. transit .." Zep Time Set :"..known_times_req[arg2][transit]['time']);
                                                                end     
                                                end                     
                                                
                                                ZM_tempText = RED.."Receiving Data..";
                                                ZM_tempTextCount = 2;
                                end
                elseif (event == "ZONE_CHANGED_NEW_AREA") then
                        
                                if (not ZSM_Data['Opts']['ZoneGUI']) then
                                                -- Opt: Show GUI when zone change contains a transport
                                                return;
                                end
                                -- Open GUI if entering zone with transport
                                for index, zone_data in zsm_data['transports'] do                                               
                                                if (zone_data['label'] ~= -1) then                                                      
                                                                local plat_data = zsm_data[zone_data['label']..'_plats'];
                                                                if (plat_data ~= nil) then                                                                              
                                                                                for index, trans_data in plat_data do
                                                                                                --DEFAULT_CHAT_FRAME:AddMessage(trans_data['name'] );
                                                                                                if (trans_data['name'] == GetRealZoneText()) then
                                                                                                                ZSMHeaderFrame:Show();
                                                                                                                ZSMFrame:Show();                                                                                                                
                                                                                                end
                                                                                end
                                                                end
                                                end
                                end
                                                        
                end
        
end

function ZSM_SlashCommandHandler(msg)

  local msgArgs;
        local numArgs;
        
        -- Get the arguments
        msg = string.lower(msg);
        msgArgs = GetArgs(msg, " ");
        
        -- Get the number of arguments
        numArgs = table.getn(msgArgs);
                                
        -- Check if command is for DKP, for 1 argument only
        if (numArgs == 0) then                                                                          
                        DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster -- Display GUI");
                        ZSMHeaderFrame:Show();
                        ZSM_Data['Opts']['ShowGUI'] = true;
        elseif (numArgs == 1) then
                        if (msgArgs[1] == "reset") then
                                        DEFAULT_CHAT_FRAME:AddMessage(RED.."ZeppelinMaster -- Session Reset!");
                                        known_times_session = {};
                                        known_times = {};
                        end
        elseif (numArgs == 2) then
                        if (msgArgs[1] == "channel") then
                                        LeaveChannelByName(dataChannel);
                                        ZSM_Opts['dataChannel'] = msgArgs[2];
                                        dataChannel = ZSM_Opts['dataChannel'];
                                        JoinChannelByName(dataChannel);
                                        DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster -- Data Channel set to [".. msgArgs[2] .."]");
                        end
        end
        
end


--[[
Extract key/value from message.
]]--
function GetArgs(message, separator)

        -- Declare 'args' variable.
        local args = {};

        -- Declare 'i' integer.
        i = 0;

        -- Search for seperators in the string and return
        -- the separated data.
        for value in string.gfind(message, "[^"..separator.."]+") do
                i = i + 1;
                args[i] = value;
        end -- end for

        -- Submit the filtered data.
        return args;
end -- end GetArgs()

Generated by GNU Enscript 1.6.5.90.