Neopixel strip control without delays

This might be what you want but you really need to explain things fully to get yourself understood.

// Version    YY/MM/DD  Description
// 1.00       21/09/08  Running sketch
// 1.01       21/09/09  Added state 4, magenta LED goes back and forth
// 1.02       21/09/09  Made name changes to different variables, added comments

#include <Adafruit_NeoPixel.h>

#define CLOSED                LOW
#define numberOfPixels        14

Adafruit_NeoPixel tira = Adafruit_NeoPixel(numberOfPixels, 2, NEO_GRB + NEO_KHZ800);

bool flag                   = false; //'false' means the TIMER is disabled

//a 'char' has a range of +-128
char incDec                 = 1;     //(incement/decrement) this will be: 1 for up, -1 for down 
char pixelNumer             = 0;

const byte heartbeatLED     = 13;    //toggles ever 500ms
const byte buttonPin        = 4;
const byte maximumState     = 4;     //there are 4 states in the 'State Machine'

byte buttonState            = 0;
byte lastButtonState        = 0;
byte mState                 = 0;     //the current state the machine is in

//timing stuff
unsigned long commonMillis;
unsigned long switchMillis;
unsigned long heartbeatMillis;

//*********************************************************************
void setup()
{
  Serial.begin(9600);
  tira.begin();
  tira.show();
  tira.setBrightness(50);

  pinMode(heartbeatLED, OUTPUT);

  pinMode(buttonPin, INPUT_PULLUP);
}

//*********************************************************************
void loop()
{
  //**********************************************
  //used to check for blocking code
  if (millis() - heartbeatMillis >= 500)
  {
    //restart the TIMER
    heartbeatMillis = millis();

    //toggle the LED state
    digitalWrite(heartbeatLED, !digitalRead(heartbeatLED));

  }

  //**********************************************
  //is it time to check the switches ?
  if (millis() - switchMillis >= 50)
  {
    //restart the TIMER
    switchMillis = millis();

    checkSwitches();
  }

  //**********************************************
  //State Machine
  switch (mState)
  {
    //*******************
    case 0:
      //do nothing

      break;

    //*******************
    case 1:
      if (flag == true && millis() - commonMillis >= 500)
      {
        //restart the TIMER
        commonMillis = millis();

        //green
        tira.setPixelColor(pixelNumer, 255, 0, 0);
        tira.show();

        //next LED
        pixelNumer++;

        //are we finished ?
        if (pixelNumer > numberOfPixels - 1)
        {
          //we are finished now
          flag = false;
        }
      }

      break;

    //*******************
    case 2:
      if (flag == true && millis() - commonMillis >= 500)
      {
        //restart the TIMER
        commonMillis = millis();

        //green
        tira.setPixelColor(pixelNumer, 0, 255, 0);
        tira.show();

        //next LED
        pixelNumer++;

        //are we finished ?
        if (pixelNumer > numberOfPixels - 1)
        {
          //we are finished now
          flag = false;
        }
      }

      break;

    //*******************
    case 3:
      if (flag == true && millis() - commonMillis >= 500)
      {
        //restart the TIMER
        commonMillis = millis();

        //blue
        tira.setPixelColor(pixelNumer, 0, 0, 255);
        tira.show();

        //next LED
        pixelNumer++;

        //are we finished ?
        if (pixelNumer > numberOfPixels - 1)
        {
          //we are finished now
          flag = false;
        }
      }

      break;

    //*******************
    case 4:
      if (flag == true && millis() - commonMillis >= 100)
      {
        //restart the TIMER
        commonMillis = millis();

        //*************************
        //if we going up, we need to turn off the previous pixel
        if (pixelNumer != 0 && incDec == 1)
        {
          //turn off the preceeding pixel
          tira.setPixelColor(pixelNumer - 1, 0, 0, 0);
          tira.show();
        }

        //*************************
        //if we going down, we need to turn off the previous pixel
        if (incDec == -1)
        {
          //turn off the preceeding pixel
          tira.setPixelColor(pixelNumer + 1, 0, 0, 0);
          tira.show();
        }

        //magenta
        tira.setPixelColor(pixelNumer, 255, 0, 255);
        tira.show();

        //next pixel
        pixelNumer = pixelNumer + incDec;

        //*************************
        //have we reached the top most pixel ?
        if (pixelNumer > numberOfPixels - 1)
        {
          //readjust to the next pixel 
          pixelNumer = numberOfPixels - 2;

          //we will now be going down
          //toggle increment/decrement
          incDec = -1;
        }

        //*************************
        //have we reached the bottom most pixel ?
        if (pixelNumer < 0)
        {
          //readjust to the next pixel 
          pixelNumer = 1;

          //we will now be going up
          //toggle increment/decrement
          incDec = 1;
        }
      }

      break;

  } //END of switch/case


} //END of loop()


//*********************************************************************
void checkSwitches()
{
  //**********************************************
  //has there been a change in state on the switch ?
  buttonState = digitalRead(buttonPin);

  if (lastButtonState != buttonState)
  {
    //update to the new state
    lastButtonState = buttonState;

    //is the switch closed?
    if (buttonState == CLOSED)
    {
      //clear all the LEDs
      clearLEDs();

      //the state in the machine
      mState++;

      //limit the state range
      if (mState > maximumState)
      {
        //back to the begining
        mState = 1;
      }

      //start with the first LED
      pixelNumer = 0;

      //enable timing
      flag = true;

      //restart the TIMER
      commonMillis = millis();
    }

  } //END of   if(buttonState != lastButtonState)

} //END of   checkSwitches()


//*********************************************************************
void clearLEDs()
{
  //all LEDs to black
  for (byte x = 0; x < numberOfPixels; x++)
  {
    tira.setPixelColor(x, 0, 0, 0);
  }

  tira.show();

} //END of clearLEDs()