--
-- InteractiveButtons
-- Specialization for an interactive control button
--
-- @author      Manuel Leithner (SFM-Modding)
-- @version     v2.1
-- @date          29/08/11
-- @history:    v1.0 - Initial version
--                v2.0 - converted to ls2011
--                v2.1 - improvements
--
-- free for noncommerical-usage
--

InteractiveButtons = {};

function InteractiveButtons.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(InteractiveControl, specializations);
end;

function InteractiveButtons:load(savegame)

    local i=0;
    while true do
        local buttonName = string.format("vehicle.interactiveComponents.buttons.button(%d)", i);    
        if not hasXMLProperty(self.xmlFile, buttonName) then
            break;
        end;
        local name = Utils.getNoNil(g_i18n:getText(getXMLString(self.xmlFile, buttonName .. "#name")), "ERROR");
        local mark = Utils.indexToObject(self.components, getXMLString(self.xmlFile, buttonName .. "#mark"));
        local highlight = getChildAt(mark, 0);
        local size = Utils.getNoNil(getXMLFloat(self.xmlFile, buttonName .. "#size"), 0.1);
        local event = getXMLString(self.xmlFile, buttonName .. "#event");
        local onMessage = g_i18n:getText(Utils.getNoNil(getXMLString(self.xmlFile, buttonName .. "#onMessage"), "ic_button_on"));
        local offMessage =  g_i18n:getText(Utils.getNoNil(getXMLString(self.xmlFile, buttonName .. "#offMessage") , "ic_button_off"));
    
        local button = Button:new(nil, highlight, name, mark, size, event, self, onMessage, offMessage, self.infoBar);
        
        button.synch = Utils.getNoNil(getXMLBool(self.xmlFile, buttonName .. "#synch"), true);

        table.insert(self.interactiveObjects, button);
        i = i + 1;
    end;
end;

function InteractiveButtons:delete()
end;

function InteractiveButtons:mouseEvent(posX, posY, isDown, isUp, button)
end;

function InteractiveButtons:keyEvent(unicode, sym, modifier, isDown)
end;

function InteractiveButtons:update(dt)    
end;

function InteractiveButtons:draw()
end;



--
-- Button Class
-- Specifies an interactive Button
--
-- SFM-Modding
-- @author  Manuel Leithner
-- @date  29/08/11
--

Button = {};

function Button:new(node, highlight, name, mark, size, event, vehicle, onMessage, offMessage, infobar)

    local Button_mt = Class(Button, InteractiveComponentInterface);        
    local instance = InteractiveComponentInterface:new(node, highlight, name, mark, size, onMessage, offMessage, infobar, Button_mt);

    instance.vehicle = vehicle;
    instance.event = event;
    
    return instance;    
end;

function Button:delete()
    InteractiveComponentInterface.delete(self);
end;

function Button:mouseEvent(posX, posY, isDown, isUp, button)
    InteractiveComponentInterface.mouseEvent(self, posX, posY, isDown, isUp, button);
end;

function Button:keyEvent(unicode, sym, modifier, isDown)
    InteractiveComponentInterface.keyEvent(self, unicode, sym, modifier, isDown);
end;

function Button:update(dt)
    if self.vehicle ~= nil then
        self.isOpen = self.vehicle.currentLight == 2;
    end;
    if self.vehicle ~= nil then
        if self.event == "toggleMotorIgnition" then        
            self.isOpen = self.vehicle.isMotorStarted;
        end;
    end;

    InteractiveComponentInterface.update(self, dt);
end;

function Button:draw()
    InteractiveComponentInterface.draw(self);
end;

function Button:doAction(dt)


        if self.vehicle ~= nil then
        if self.event == "toggleMotorIgnition" then
            if self.vehicle.isMotorStarted then
                self.vehicle:invokeIgnition(false, noEventSend);
            else
                self.vehicle:invokeIgnition(true, noEventSend);
            end;
        end;    
    end;



if self.event == "toggleBeaconLights" then
        if self.vehicle ~= nil then
            if self.vehicle.beaconLightsActive then
                self.vehicle:setBeaconLightsVisibility(false);
            else
                self.vehicle:setBeaconLightsVisibility(true);
            end;
        end;
    end;

    if self.event == "toggleVarioGrip" then
        if self.vehicle ~= nil then
            exvariogrip = true;
        end;
    end;

    if self.event == "toggleRightIndicator" then
        if self.vehicle ~= nil then
            if not self.vehicle.B3.wl then
                if self.vehicle.B3.dirRight[1].a then
                    self.vehicle:setState("dirLeft", false);
                    self.vehicle:setState("dirRight", false);
                else
                    self.vehicle:setState("dirLeft", false);
                    self.vehicle:setState("dirRight", true);
                end;
            end;
        end;
    end;
    if self.event == "toggleLeftIndicator" then
        if self.vehicle ~= nil then
            if not self.vehicle.B3.wl then
                if self.vehicle.B3.dirLeft[1].a then
                    self.vehicle:setState("dirLeft", false);
                    self.vehicle:setState("dirRight", false);
                else
                    self.vehicle:setState("dirLeft", true);
                    self.vehicle:setState("dirRight", false);
                end;
            end;
        end;
    end;
    if self.event == "toggleWarningLights" then
        if self.vehicle ~= nil then
            if self.vehicle.B3.wl then
                self.vehicle:setState("warnlights", false);
                self.vehicle:setState("dirLeft", false);
                self.vehicle:setState("dirRight", false);
            else
                self.vehicle:setState("warnlights", true);
                self.vehicle:setState("dirLeft", true);
                self.vehicle:setState("dirRight", true);
            end;
        end;
    end;
if self.event == "toggleFrontWorklights" then
        if self.vehicle ~= nil then
            local i = 3;
            if self.vehicle.B3.work[i].a then
                self.vehicle:setState("work:"..i, false);
            else
                self.vehicle:setState("work:"..i, true);
            end;
        end;
    end;
if self.event == "toggleFrontWorklights" then
        if self.vehicle ~= nil then
            local i = 4;
            if self.vehicle.B3.work[i].a then
                self.vehicle:setState("work:"..i, false);
            else
                self.vehicle:setState("work:"..i, true);
            end;
        end;
    end;
    if self.event == "toggleBackWorklights" then
        if self.vehicle ~= nil then
            local i = 1;
            if self.vehicle.B3.work[i].a then
                self.vehicle:setState("work:"..i, false);
            else
                self.vehicle:setState("work:"..i, true);
            end;
        end;
    end;
    if self.event == "toggleBackWorklights" then
        if self.vehicle ~= nil then
            local i = 2;
            if self.vehicle.B3.work[i].a then
                self.vehicle:setState("work:"..i, false);
            else
                self.vehicle:setState("work:"..i, true);
            end;
        end;
    end;
    
end;

function Button:onEnter(dt)
    InteractiveComponentInterface.onEnter(self, dt);
end;

function Button:onExit(dt)
    InteractiveComponentInterface.onExit(self, dt);
end;

function Button:setActive()
    InteractiveComponentInterface.setActive(self, isActive);
end;

function Button:setVisible(isVisible)
    InteractiveComponentInterface.setVisible(self, isVisible);
end;