Simple timer

Hi! i founded and slightly modified code which i founded somewhere on internet. Idea is this: i need one button timer, with 4 modes. Each mode have different time untill sound alarm. Every time i select new mode, counter automatically start to count, unless its interrupted by selecting other mode.
I succeded to write and modify most of the code, problem is, when i select for example mode 3, counter start to count untill 15 seconds, and it not start alarm. When i try to interrupt it, its not interrupting at all. Looping is just alarm function, i need alarm LED to blink.
Delay is timer
Why its behaving weird? What im doing wrong?

/*
 Using a single switch to select between 3 modes
*/
// Schematic: http://www.pwillard.com/files/mode4.jpg
//===============================================================
// Global Variables & Constants
//===============================================================
 
const int led1 = 2; // LED1 ANODE
const int led2 = 3;
const int led3 = 4; // LED2 ANODE
const int led4 = 5; // LED3 ANODE
const int alarm = 6;
const int sw1 = 7; // Active HIGH, held low by 4.7K
 
int mode = 0; // Selector State (Initial state = ALL OFF)
int val = 0; // Pin 13 HIGH/LOW Status
int butState = 0; // Last Button State
int modeState = 0; // Last Mode State
boolean debug = 1; // 1 = Print Serial Enabled / 0 = disabled
 
//===============================================================
// SETUP
//===============================================================
void setup () {
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(alarm, OUTPUT);
 pinMode(sw1, INPUT);
 if (debug){
 Serial.begin(9600);
 Serial.print("Initial Mode: ");
 Serial.println(mode);
 Serial.print("Setup Complete\n");
 }
}
 
//===============================================================
// Main Loop
//===============================================================
void loop() {
 
 val = digitalRead(sw1);
 
 // If we see a change in button state, increment mode value
 if (val != butState && val == HIGH){
 mode++;
 }
 
 butState = val; // Keep track of most recent button state
 
 // No need to keep setting pins *every* loop
 if (modeState != mode){
 
 // If no keys have been pressed yet don't execute
 // the switch code below
 // if (mode != 0) {
 
 switch ( mode ) {
 //case 1 is actually handled below as default
 
case 2: //second led, it should sound alarm after 10 seconds unless user interrupt
 digitalWrite(led1, LOW);
 digitalWrite(led2, HIGH); //hold second led high
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
  delay (10000);       //wait for 10 seconds before sound alarm
 loop();
 {
 digitalWrite(alarm, HIGH);
 delay (500);
 digitalWrite(alarm, LOW);
 delay (500);
 }
 showState();
 break;
 case 3:
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, LOW);
  delay (15000); //wait for 15 seconds before sound alarm
 loop();
 {
 digitalWrite(alarm, HIGH);
 delay (500);
 digitalWrite(alarm, LOW);
 delay (500);
 }
 showState();
 break;
 case 4:
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, HIGH);
  delay (20000);  //wait for 20 seconds before start alarm
 loop();
 {
 digitalWrite(alarm, HIGH);
 delay (500);
 digitalWrite(alarm, LOW);
 delay (500);
 }
 showState();
 break;
 default:
 mode = 1;
 // loop back to 1 by default, seems redundant but
 // it also handles the "mode is > 3" problem
 digitalWrite(led1, HIGH);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
  delay (5000);
 loop();
 {
 digitalWrite(alarm, HIGH);
 delay (500);
 digitalWrite(alarm, LOW);
 delay (500);
 }
 showState();
 break;
 } // end switch
// } // end of "if mode = 0" check
 } // end of ModeState check
 modeState = mode; // Keep track of mode recent mode value
 delay(20); // slow the loop just a bit for debounce
}
 
//===============================================================
// Subroutine
//===============================================================
void showState() {
 if (debug){
 Serial.print("Mode: ");
 Serial.println(mode);
 }
}
loop();

You should never be calling loop from loop. This is called recursion and it causes the stack to grow and grow until the program crashes. If you want the loop function to end there and go back to the top then use a return.

i figured blink without delay. But what you suggest for me to check out for that timer function instead of delay?

nikola50:
i figured blink without delay. But what you suggest for me to check out for that timer function instead of delay?

Yes, blink without delay to get rid of the delays in your code. But the recursion is a much bigger problem and it must be fixed first.

well, i simply delete loop inside of loop and instead use blink without delay for alarm (led diode)...
im sorry, im bit noobish about this, so im figuring stuff out as i go