<?xml version="1.0" encoding="UTF-8"?>

<ccxml xmlns="http://www.w3.org/2002/09/ccxml" version="1.0">
  <var name="inboundID"/>
  <var name="outboundID"/>
  <var name="DestURI"/>
  <var name="CallingURI"/>
  <var name="Balance_dollars" />
  <var name="Balance_cents" />
  <var name="CallTimeout" />
  <var name="CallTimeout_Mins" />
  <var name="CallTimeout_Secs" />
  <var name="talkTime" expr="0"/>
  <var name="UnitTimeout" expr="'0'"/> 
  <var name="initState" expr="'initstate'" />
  <var name="isAccounted" expr="0" />
  <var name="bLegBReneg" expr="'true'" />

<eventprocessor statevariable="initState">

    <transition state="initstate" event="connection.alerting" name="event$">
        <assign name="inboundID" expr="event$.connectionid" />
        <assign name="initState" expr="'legaaccepting'"/>
        <assign name="CallingURI" expr="event$.remote"/>
	<assign name="DestURI" expr="event$.requested"/>
        <assign name="SIP_CallID" expr="event$.sipcallid"/>
        <accept connectionid="inboundID" keepalive="no" />
    </transition>

    <transition state="legaaccepting" event="connection.accept.failed" name="event$">
        <assign name="initState" expr="'legaconnectionfailure'" />
        <if cond="CallingURI == ''">
            <exit/>
        <else/>
	<accountstop accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="DestURI" ServiceID="Audio" CallID="SIP_CallID" />
        </if>

    </transition>

    <transition state="legaconnectionfailure" event="account.stop.success" name="event$">
	<exit/>
    </transition>

    <transition state="legaconnectionfailure" event="account.stop.error" name="event$">
	<exit/>
    </transition>

    <transition state="legaaccepting" event="connection.connected" name="event$">

	<if cond="DestURI == ''">
		<assign name="initState" expr="'teardowninprogress'"/>
		<disconnect connectionid="inboundID"/>
	<else/>
		<assign name="initState" expr="'legaauthorizing'"/>
		<translatenum fromnumber="CallingURI" tonumber="DestURI" numbertobemodified="DestURI" modifiednumber="DestURI" translatefor="authorization"/>
		
		<authorize SessionID="OutSessionID" authtype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AccessNumber="DestURI" ServiceID="Audio" CallID="SIP_CallID" UnitReservation="no"/>
		
        </if>
	
    </transition>


    <transition state="legaauthorizing" event="authorize.success" name="event$">	
	<assign name="initState" expr="'legbcalling'"/>
	<assign name="CallTimeout" expr="event$.auth_totaltimeout"/>
        <assign name="UnitTimeout" expr="event$.auth_UnitTime"/>
        <assign name="CallTimeout_Mins" expr="event$.auth_timeout_minutes"/>
        <assign name="CallTimeout_Secs" expr="event$.auth_timeout_seconds"/>
	
	<createcall dest="DestURI" callerid="CallingURI" connectionid="outboundID" AuthSessionID="OutSessionID" callidsuffix="OutSessionID" timeout="'30s'" connectedtimelimit="CallTimeout" keepalive="no"/>
	
    </transition>

    <transition state="legaauthorizing" event="authorize.timeout" name="event$">
	<assign name="initState" expr="'teardowninprogress'"/>
	<disconnect connectionid="inboundID"/>
    </transition>

    <transition state="legaauthorizing" event="authorize.error" name="event$">
	<assign name="initState" expr="'teardowninprogress'"/>
	<disconnect connectionid="inboundID"/>
    </transition>


    <transition state="legbcalling" event="connection.failed" name="event$">

        <if cond="isAccounted == 0">
            <assign name="isAccounted" expr="isAccounted+1" />
            <assign name="talkTime" expr="0"/>
	    <assign name="initState" expr="'teardowninprogress'"/>
	    <disconnect connectionid="inboundID"/>
        </if>

    </transition>

    <transition state="legbcalling" event="connection.progressing" name="event$">

    </transition>

    <transition state="legbcalling" event="connection.connected" name="event$">
        <assign name="initState" expr="'attemptingjoin'"/>
        <join id1="inboundID" id2="outboundID" duplex="'full'"/>
    </transition>

    <transition state="attemptingjoin" event="connection.disconnected" name="event$">
	<assign name="initState" expr="'teardowninprogress'" />
	<assign name="talkTime" expr="0" />
	<if cond="disconnectedID == outboundID">
		<disconnect connectionid="inboundID"/>
	<else/>
		<disconnect connectionid="outboundID"/>
	</if>

    </transition>


    <transition state="attemptingjoin" event="connection.media.renegotiate"  name="event$">
        <assign name="initState" expr="'leg1RenegotiationInitiated'"/>
        <assign name="RenegotiationID" expr="event$.connectionid" />
        <renegotiatemedia connectionid="RenegotiationID"/>
    </transition>

    <transition state="leg1RenegotiationInitiated" event="connection.renegotiate.success"  name="event$">
        <assign name="initState" expr="'attemptingjoin'"/>
        <join id1="inboundID" id2="outboundID" duplex="'full'"/>
    </transition>



    <transition state="leg1RenegotiationInitiated" event="connection.disconnected"  name="event$">
	<assign name="initState" expr="'teardowninprogress'" />
	<assign name="talkTime" expr="0" />
	<assign name="isAccounted" expr="0" />
	<if cond="event$.connectionid == outboundID">
		<disconnect connectionid="inboundID"/>
	<else/>
		<disconnect connectionid="outboundID"/>
	</if>
    </transition>

    <transition state="leg1RenegotiationInitiated" event="connection.media.renegotiate"  name="event$">
        <assign name="initState" expr="'leg2RenegotiationInitiated'"/>
        <assign name="RenegotiationID" expr="event$.connectionid" />
        <assign name="LegBRenegID" expr="event$.connectionid" />
        <assign name="bLegBReneg" expr="'true'" />
        <renegotiatemedia connectionid="RenegotiationID"/>
    </transition>

    <transition state="leg2RenegotiationInitiated" event="connection.renegotiate.success"  name="event$">
        <if cond="bLegBReneg == 'true'">
            <if cond="LegBRenegID == event$.connectionid" >
                <assign name="LegBRenegID" expr="" />
                <assign name="bLegBReneg" expr="'false'" />
                <assign name="initState" expr="'attemptingjoin'"/>
                <join id1="inboundID" id2="outboundID" duplex="'full'"/>
            </if>
        </if>
    </transition>
    
    <transition state="leg1RenegotiationInitiated leg2RenegotiationInitiated" event="connection.renegotiate.failed"  name="event$">
	<assign name="isAccounted" expr="0" />
	<assign name="initState" expr="'legbdisconnecting'" />
	<disconnect connectionid="outboundID"/>
    </transition>

    <transition state="attemptingjoin" event="conference.joined"  name="event$">
        <assign name="initState" expr="'callsjoined'"/>
        <assign name="isAccounted" expr="0" />
	<accountstart SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AccessNumber="DestURI" ServiceID="Audio" CallID="SIP_CallID" />
    </transition>

    <transition state="attemptingjoin" event="error.conference.join"  name="event$">
	<assign name="initState" expr="'legbdisconnecting'" />
	<disconnect connectionid="outboundID"/>
    </transition>

    <transition state="callsjoined" event="account.start.error" name="event$">

    </transition>

    <transition state="callsjoined" event="connection.disconnected" name="event$">
        <assign name="disconnectedID" expr="event$.connectionid" />
        <assign name="connectedTime" expr="event$.connectedtime" />
        <assign name="initState" expr="'confunjoined'" />
    </transition>

    <transition state="confunjoined" event="conference.unjoined" name="event$">
	<assign name="initState" expr="'teardowninprogress'" />
        <assign name="talkTime" expr="event$.jointime" />
        <if cond="disconnectedID == outboundID">
		<disconnect connectionid="inboundID"/>
        <else/>
		<disconnect connectionid="outboundID"/>
        </if>
    </transition>

    <transition state="legbcalling" event="connection.disconnected" name="event$">
	<assign name="initState" expr="'teardowninprogress'" />
        <assign name="talkTime" expr="0" />
        <disconnect connectionid="outboundID"/>
    </transition>

    <transition state="legbdisconnecting" event="connection.disconnected" name="event$">
	<assign name="initState" expr="'teardowninprogress'" />
        <disconnect connectionid="inboundID"/>
    </transition>

    <transition state="legaauthorizing teardowninprogress" event="connection.disconnected" name="event$">
	<assign name="initState" expr="'accountingcall'" />
	<if cond="isAccounted == 0">
		<assign name="isAccounted" expr="isAccounted+1" />
		<accountstop SessionID="OutSessionID" accttype="ANI" UserName="CallingURI" CallingStationId="CallingURI" CalledStationId="DestURI" AcctSessionTime="talkTime" AccessNumber="DestURI" ServiceID="Audio" CallID="SIP_CallID" Reason="'Success'"/>
	<else/>
		<exit/>
	</if>

    </transition>

    <transition state="accountingcall" event="account.stop.success" name="event$">
	<exit/>
    </transition>

    <transition state="accountingcall" event="account.stop.error" name="event$">
	<exit/>
    </transition>


  </eventprocessor>
</ccxml> 

