context dialextens
{
	/* 
		101 thru 123, 149 thru 152
        */
	_10X => Dial(Zap/${EXTEN:2},30,Ttw);
	_1ZX => Dial(Zap/${EXTEN:1},30,Ttw);
}
/* 
    Due to extenal wiring:

  dialing 125 will ring 101
  dialing 126 will ring 102
   and so on until
  dialing 147 will ring 123

We can dial out on zap 69 thru 72; and 25-47

*/

context dialthrus
{
	/*  369-372; 325-347 */
	_3XX => Dial(Zap/${EXTEN:1},30,Ttw);
}

context t1incoming
{
	includes
	{
		dialextens;
		parkedcalls;
	}
	s => {
		Answer();
		Background(welcome-to-test-machine);
	}

}

context t1extension
{
	includes
	{
		dialextens;
		dialthrus;
	}

}

context incoming
{
	includes
	{
		dialextens;
		parkedcalls;
	}
	s => {
		Answer();
		Background(welcome-to-test-machine);
	}
}

context incoming
{
	s => {
		Answer();
	}
}

macro std-priv-exten( dev, ext , timeout, opts, torcont, dontcont )
{
        // &increment_chosecount();
        dial_again:
        Dial(${dev},${timeout},${opts});
        switch(${DIALSTATUS})
                {
        case TORTURE:
                goto ${torcont}|s|begin;
                break;

        case DONTCALL:
                goto ${dontcont}|s|begin;
                break;

        case BUSY:
        label_busy:
                Read(reply|work-exten-busy|1||2|15);
		if ("${reply}"=="")
			goto label_busy; // infinite loop if Read has probs!!
                switch(${reply})
                {
                case 1:
                       Set(time1=${EPOCH});

                  label_redial:

                       WaitMusicOnHold(5);
                       Dial(${dev},${timeout},${opts});

                       switch(${DIALSTATUS})
                       {
                       case BUSY:
                                if(${EPOCH}-${time1} >= 20)
                                        goto label_busy;
                                goto label_redial;

                       default:
                                return;// goto work_line|s|loopback;
                       }
                       break;
                case 2:
                       Voicemail(${ext}|b);
                       break;
                case 3:
                       return; // goto work_line|s|loopback;
                default:
                       Background(invalid);
                        goto label_busy;
                }
                break;

        case ANSWER:
                break;

        case NOANSWER:
        noanswer_label:
                Read(reply|work-exten-noanswer|1|skip|2|15);
                switch(${reply})
                {
                case 1:
                       switch(${ext})
                       {
                       case 10:
                                Background(no-cell);
                                break;
                       case 11:
                                // &ciddial(2729495,3072729495,30,tw,${GRAMS_TELCO},${WORK_TELCO});
                                break;
                       case 12:
                                // &ciddial(2725560,3072725560,30,tw,${GRAMS_TELCO},${WORK_TELCO});
                                break;
                       case 13:
                                // &ciddial(2720197,3072720197,30,tw,${GRAMS_TELCO},${WORK_TELCO});
                                break;
                       case 14:
                                // &ciddial(2501174,3072501174,30,tw,${GRAMS_TELCO},${WORK_TELCO});
                                break;
                       case 15:
                                Background(no-cell);
                                break;
                       case 16:
                                Background(no-cell);
                                break;
                       default:
                                Background(invalid);
                                break;
                       }
                       goto noanswer_label;
                       break;
                case 2:
                       Voicemail(${ext}|u);
                       break;
                case 3:
                       return; // goto work_line|s|loopback;
                default:
                       Background(invalid);
                       goto noanswer_label;
                }
                Voicemail(${ext}|u);
                break;
        default:
                Voicemail(${ext}|u);
        }
}
/* Putting these 3 funcs in extensions.conf!
macro funcC(a,b)
{
	Set(Key=);
      menu:
	Read(Key,main-menu,1,n,1,5);
	if("${Key}" = "2")
		goto y,lab1;
	catch y
	{	lab1:
		&funcB(${a},${b});	
	}
}

macro funcB(a,b)
{
	Set(Key=);
      menu:
	Read(Key,tt-monkeys,1,n,1,5);
	if("${Key}" = "2")
		goto z,lab2;
	catch z
	{	lab2:
		&funcC(${a},${b});	
	}
}

macro funcA()
{
	&funcB(1,2);
}
*/

context extension
{
	includes
	{
		dialextens;
		dialthrus;
		parkedcalls;
	}
	5 => {
		Record(recording:wav);
		Background(recording);
	}

	81 => {
		iterations=1000000;
		Set(time1=${EPOCH});
		for(i=1; ${i}<${iterations}; i=${i}+1)
		{
			NoOp(Hello);
		}
		Set(time2=${EPOCH});
		Verbose(The time diff is $[${time2} - ${time1} ] seconds);
		Verbose(Which means that the priorities/sec = $[4* ${iterations} / (${time2} - ${time1}) ]);
		SayNumber($[4 * ${iterations} / (${time2} - ${time1}) ]);
	}
	82 => {
			&ndeep(100000);
			Verbose(Finished 100000 levels deep call!);
		}
	83 => {
		switch (${EXTEN}) 
		{
		pattern 8X:
    			Verbose(do something to prepare it);
		pattern 9X:
    			Verbose(handle both 1xx and 2xx calls);
		pattern [4-7]X:
			Verbose(and this too!);
		}
		Set(junky=${RAND(0|99999)});
		Verbose(Here is a random number: ${junky}.);
	}
	84 => {
		agi(agi://192.168.134.252/|hello|goodbye|whatever|whoknows,hell2,hello3);
	}
	85 => {
		&std-priv-exten( Zap/50, 150 , 25, mtw, torcont, dontcont );
	}
	86 => {
		Verbose(The version is: ${VERSION()} );
		Verbose(The versionnum is: ${VERSION(ASTERISK_VERSION_NUM)} );
		Verbose(The user is: ${VERSION(BUILD_USER)} );
		Verbose(The hostname is: ${VERSION(BUILD_HOSTNAME)} );
		Verbose(The machine is: ${VERSION(BUILD_MACHINE)} );
		Verbose(The OS is: ${VERSION(BUILD_OS)} );
		Verbose(The date is: ${VERSION(BUILD_DATE)} );
		Verbose(The kernel is: ${VERSION(BUILD_KERNEL)} );
		Set(vinf=${VERSION()});
		Set(vrand=${RAND()});
		if( ${ISNULL(${vinf})} )
		{
			if( ${ISNULL(${vrand})} )
				Verbose(Version 1.2 or earlier);
			else
				Verbose(Version 1.4!!!);
		}
		else
			Verbose(${vinf} indicates version pre-1.6 or higher);
	}
	871 => {
		NoOp(                                                                                                    1         1         1          1         1         1         1);
		NoOp(          1         2         3         4         5         6         7         8         9         0         1         2          3         4         5         6);
		NoOp(012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678890123456789012345678901234567890);
		NoOp(${EXTEN:1:2}   ${EXTEN}   ${EXTEN:1}                                                                                                    1         1         1          1         1     1         1);
		&dialoutpstn(${TDIRECTCALL-PST}/0${EXTEN},${E${CALLERID(num)}-OPT},${TDIRECTCALL-CID},${TDIRECTCALL-MAX},RotaPadrao) ;

	}
	872 => {
		Set(ChannelOnly=${CUT(CHANNEL||1)});
		Verbose(ChannelOnly=${ChannelOnly}; neat huh?);
		Set(ChannelOnly=${CUT(CHANNEL,,1)});
		Verbose(ChannelOnly=${ChannelOnly}; neat huh?);
	}	
	873 => {
		NOOP(this is a forkcdr test);
		Set(CALLERID(num)=1234567890);
		Set(CALLERID(name)=before fork);
		Forkcdr(v);
		Set(CALLERID(num)=0987654321);
		Set(CALLERID(name)=after fork);
		Answer();
		Echo();
		Hangup();
	}
        874 => {
		SayDigits(307-754-5675);
                SayPhoneNumber(307-754-5675);
                SayDigits(--);
                SayPhoneNumber(123-456-7890);
                SayDigits(++);
                SayPhoneNumber(307-754-4454);
        }
	875 => {
		&funcA();
		&funcD();
	}
	876 => {
		NoOp(Query resultid ${connid} SELECT var1\, var2 FROM did);
		NoOp($["Query resultid ${connid} SELECT var1\, var2 FROM did"]);
		NoOp($["Query resultid ${connid} SELECT var1, var2 FROM did"]);
		goto test5,s,1;
	}
	88 => {
		SET(LIMIT_PLAYAUDIO_CALLER=yes);
		SET(LIMIT_PLAYAUDIO_CALLEE=no);
		SET(LIMIT_TIMEOUT_FILE=timeup);
		SET(LIMIT_CONNECT_FILE=limit60);
		SET(LIMIT_WARNING_FILE=almostup);
		Dial(Zap/51,20,L(60000:30000:8000));
	}
	89 => {
		goto callbackmenu|100|1;
	}
}

context income1
{
	s => {
		Answer();
		Dial(Zap/50,20,m);
	}
	150 => Dial(Zap/50,20,m);
}

context callbackmenu
{
	_X. => {
			Answer();
			Wait(1);
			Set(TIMEOUT(digit)=5);
			Set(TIMEOUT(response)=30);
			DISA(no-password,callbackdialout);
	}
}

context callbackdialout
{
	_X. => {
			Dial(Zap/51,20,w);
		}

}


macro dialoutpstn(something1, something2, something3, something4, something5)
{
	Verbose(${something1}--- ${something2}--- ${something3}--- ${something4}--- ${something5});
}

macro ndeep(level)
{
        if( ${level} == 0)
        {
                Verbose(2|Got to Level 0);
                return;
        }
        &ndeep($[${level}-1]);
        return;
}
