package com.linx.dposandroid;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.view.Menu;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.linx.dtefmobile.*;
import android.util.Log;
import org.json.JSONObject;
import com.linx.DTEFMobile;

import rede.smartrede.sdk.FlexTipoPagamento;
import rede.smartrede.sdk.Intents;
import rede.smartrede.sdk.Payment;
import rede.smartrede.sdk.PaymentStatus;
import rede.smartrede.sdk.Receipt;
import com.linx.dtefmobile.CKeyMapButtons;
import android.view.Window;

public class CDPOSDRVTELA extends Activity implements CDTEFMobilePromptX {
	public final int TRANSACAO_CARTAO_CREDITO = 1;
	public final int TRANSACAO_CARTAO_DEBITO = 2;
	public final int TRANSACAO_CANCELAMENTO = 3;
	public final int TRANSACAO_VOUCHER = 4;
	public final int TRANSACAO_REIMPRESSAO = 5;
	public final int TRANSACAO_PRE_AUTORIZACAO = 6;
	public final int TRANSACAO_CONFIRMA_PRE_AUT = 10;
	
	public final int TRANSACAO_PAGAMENTO_CONTAS = 15;
	
	public final int TRANSACAO_CONSULTA_LOJA_DTEF = 17;
	public final int TRANSACAO_CARTAO_FROTA = 25;
	
	public final int TRANSACAO_PAGAMENTO_FATURA = 37;	
	public final int TRANSACAO_ESPECIAL_COLETA_INFORMACAO_PINPAD = 121;
	
	public final int TRANSACAO_CONSULTA_SALDO   = 150; // atualmente somente sitef
	public final int TRANSACAO_RESGATE_CREDITO  = 151; // atualmente somente sitef
	public final int TRANSACAO_GERENCIAL  = 152; // atualmente somente sitef
	
	public final int TRANSACAO_CONFIRMACAO = 1202;
	public final int TRANSACAO_DESFAZIMENTO = 1402;
	
	private static final int PAGAMENTO_CIELO_REQUEST = 100;
	private static final int CANCELAMENTO_CIELO_REQUEST = 200;
	
	private static final int PAGAMENTO_REDE_REQUEST     = 500;
	private static final int REPRINT_REDE_REQUEST       = 510;
	private static final int CANCELAMENTO_REDE_REQUEST  = 520;
	
	private static final int RECEBIMENTO_CIELO_MOBILE = -1;

	private static int iSequencialOperacao = 1;
	private static int iNSUSequencial4 = 0;
	private static int iNSUSequencial5 = 0;
	
	boolean bCancelPressionado = false;
	boolean bOKPressionado = false;
	String sTextoDigitado;
	CDPOSDRVTELA objActivity;
	TextView textTerminal;
	int iRetorno;
    private FakeR fakeR;
	static SharedPreferences spDados;
	final CDTEFMobile oDTEFMobile = new CDTEFMobile();

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        
        fakeR = new FakeR(this);
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(fakeR.getId("layout", "activity_cdposdrvtel"));
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, fakeR.getId("layout", "window_title"));
      
    if (findViewById(fakeR.getId("id", "fragment_container")) != null) {

			// se tiver restaurando de um estado anterior nao necessita de
			// mudanca...
    if (savedInstanceState != null)
      return;
    }
      
//  TextView textTerminal=(TextView)findViewById(fakeR.getId("id", "textTerminal"));
//  textTerminal.setTextColor(Color.BLACK);     	
//  textTerminal.setTextSize(14);
  
    Button btnOK = (Button) findViewById(fakeR.getId("id", "btnOK"));
    btnOK.setBackgroundColor(Color.parseColor("#4CAF50")); 
    btnOK.setTextColor(Color.WHITE);     	
    btnOK.setTextSize(18);
    btnOK.setOnClickListener(new View.OnClickListener() {
 
      @Override
      public void onClick(View arg0) {
        bCancelPressionado=false;
        bOKPressionado=true;
            	
            	// desativa o teclado quando usa o botao OK para prosseguir com a transacao
            	View view = getCurrentFocus();
            	if (view != null) {  
            	    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            	    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            	}            	
      }
    }); 		
    
    Button btnCancelar = (Button)findViewById(fakeR.getId("id", "btnCancela"));
    btnCancelar.setTextSize(18);
    btnCancelar.setBackgroundColor(Color.parseColor("#EF5350")); 
    btnCancelar.setTextColor(Color.WHITE);     	   
    
    btnCancelar.setOnClickListener(new View.OnClickListener() {
 
      @Override
      public void onClick(View arg0) {
        bCancelPressionado=true;
        bOKPressionado=false;
      }
    });		
    
    Intent i = getIntent();
    Bundle extras = i.getExtras();

    String action = extras.getString("action");
    String parameters = extras.getString("parameters");
    if (action.equals("executeTransaction") || action.equals(""))
    {
      int iCodigoTransacao = extras.getInt("CodigoTransacao"); // MainActivity
      String sValorTransacao = "000";
      if (!parameters.equals(""))
      {
        iCodigoTransacao = Integer.parseInt(ValorParametro(parameters, "CodigoTransacao")); 
        sValorTransacao = ValorParametro(parameters, "ValorTransacao");
      }
  
      Log.v("CDPOSDRVTELA", "Create DPOSDRVTELA codigoTransacao=" + iCodigoTransacao);

      String jsonString = extras.getString("MENSAGEM"); // Cielo Mobile
      
      switch (iCodigoTransacao) {
	    case RECEBIMENTO_CIELO_MOBILE:
        case TRANSACAO_CARTAO_CREDITO:
        case TRANSACAO_CARTAO_DEBITO:
		case TRANSACAO_VOUCHER:
        case TRANSACAO_CANCELAMENTO:
		case TRANSACAO_PAGAMENTO_FATURA:
		case TRANSACAO_PAGAMENTO_CONTAS:
		case TRANSACAO_PRE_AUTORIZACAO:
		case TRANSACAO_CONFIRMA_PRE_AUT:
		case TRANSACAO_CONSULTA_LOJA_DTEF:
		case TRANSACAO_REIMPRESSAO:
		case TRANSACAO_CARTAO_FROTA:
		case TRANSACAO_CONSULTA_SALDO:
		case TRANSACAO_RESGATE_CREDITO:
		case TRANSACAO_GERENCIAL: 
          executaTransacao(iCodigoTransacao, parameters);
		  break;
		case TRANSACAO_ESPECIAL_COLETA_INFORMACAO_PINPAD:
		  executaTransacaoEspecial(iCodigoTransacao, parameters);
		  break;
      }
    
      Log.v("CDPOSDRVTELA", "Create DPOSDRVTELA executou transacao=" + iCodigoTransacao);

    }
    else if (action.equals("confirmTransaction"))
    {
      executaTransacao(-2, parameters);
    }
    else if (action.equals("undoTransaction"))
    {
      executaTransacao(-3, parameters);
    }
    else if (action.equals("finalizeTransaction"))
    {
      executaTransacao(-4, parameters);
    }
  }

    @Override
    protected void onStart() {
    	super.onStart();
    	Log.v("CDPOSDRVTELA", "[onStart]");
    }

    @Override
    protected void onRestart() {
    	super.onRestart();
    	Log.v("CDPOSDRVTELA", "[onRestart]");
    }

    @Override
    protected void onResume() {
    	super.onResume();
    	Log.v("CDPOSDRVTELA", "[onResume]");
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
 		Log.v("onKeyLongPress", "keyCode=" + keyCode);
 	    if (keyCode == KeyEvent.KEYCODE_ENTER) {
 	    	System.out.println("[onKeyLongPress] keyCode=[" + Integer.toString(keyCode) + "]");
 	    }
        
        return super.onKeyLongPress(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
 		Log.v("onKeyUp", "keyCode=" + keyCode);
 	    if (keyCode == KeyEvent.KEYCODE_ENTER) {
 	    	System.out.println("[onKeyUp] keyCode=[" + Integer.toString(keyCode) + "]");
 	    }

        return super.onKeyUp(keyCode, event);
    }    

 	@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
 		Log.v("onKeyDown", "keyCode=" + keyCode);
 	    if (keyCode == KeyEvent.KEYCODE_ENTER) {
 	    	System.out.println("[onKeyDown] keyCode=[" + Integer.toString(keyCode) + "]");
 	    }
 	    
 	    return super.onKeyDown(keyCode, event);
    }
    
	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		Log.v("dispatchKeyEvent", "Key: " + event.getKeyCode());
		return super.dispatchKeyEvent(event);
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent event) {
		int eventAction = event.getAction();
		
		Log.v("dispatchTouchEvent", "eventAction=" + eventAction);

		// put your code in here to handle the event
	    switch (eventAction) {
	        case MotionEvent.ACTION_DOWN:
	    		Log.v("dispatchKeyEvent", "ACTION_DOWN");
	            break;
	        case MotionEvent.ACTION_UP:
	    		Log.v("dispatchKeyEvent", "ACTION_UP");
	            break;
	        case MotionEvent.ACTION_MOVE:
	    		Log.v("dispatchKeyEvent", "ACTION_MOVE");
	            break;
	    }
		
		return super.dispatchTouchEvent(event);
	}
	
    @Override
    public void onBackPressed() {
    	super.onBackPressed();
      setaOperacaoCancelada(true);
    	Log.v("CDPOSDRVTELA", "[onBackPressed]");
    }
    
 	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)  {
		if (requestCode == PAGAMENTO_REDE_REQUEST) {
            Payment payment = data.getParcelableExtra(Intents.INTENT_EXTRAS_PAYMENT);
            if (payment.getStatus().equals(PaymentStatus.COMPLETED)) {
                Toast.makeText(this, "Payment Completed", Toast.LENGTH_LONG).show();
            } 
            else if (payment.getStatus().equals(PaymentStatus.AUTHORIZED)) {
                Receipt receipt = payment.getReceipt();
                
                String s = "Payment Authorized \n";
                s = s + "Valor: " + Long.toString(payment.getAmount() / 100) + "\n";
                Toast.makeText(this, s, Toast.LENGTH_LONG).show();
                
            	// seta o retorno do modulo de pagamento do Poynt
                oDTEFMobile.setContext(this);
                oDTEFMobile.setPromptX(this);
                
    			// seta o nome da aplicacao (necessario para o Poynt da Rede)
    			oDTEFMobile.setParameter("NomeAplicacao", "DPOSAndroid");
            	oDTEFMobile.resumeTransaction(payment);
            	
            	final String sNSU = oDTEFMobile.getParameter("NSU");
            	Intent intent = getIntent();
            	intent.putExtra("NSU", sNSU.toString());
        		intent.putExtra("Comprovante", oDTEFMobile.getParameter("Comprovante"));
        		
    			String sParametrosRetorno = ObtemParametrosRetorno(oDTEFMobile); 
    	    	if (sParametrosRetorno != null && sParametrosRetorno.length() > 0) {
    	    		intent.putExtra("ParametrosRetorno", sParametrosRetorno.toString());
    	    	}
            } else if (payment.getStatus().equals(PaymentStatus.CANCELED)) {
                Toast.makeText(this, "Payment Canceled", Toast.LENGTH_LONG).show();
            } else if (payment.getStatus().equals(PaymentStatus.FAILED)) {
                Toast.makeText(this, "Payment Failed", Toast.LENGTH_LONG).show();
            } else if (payment.getStatus().equals(PaymentStatus.REFUNDED)){
                Toast.makeText(this, "Payment Failed", Toast.LENGTH_LONG).show();
            } else if (payment.getStatus().equals(PaymentStatus.DECLINED)) {
                Toast.makeText(this, "Payment Declined", Toast.LENGTH_LONG).show();
            }
            
            setResult(RESULT_OK, getIntent());
        	finish();
		}
		else if (requestCode == REPRINT_REDE_REQUEST) {
			if (resultCode==Activity.RESULT_OK) {
				Toast.makeText(this, "Reimpressao OK", Toast.LENGTH_LONG).show();
				setResult(RESULT_OK, getIntent());
			} 
			else {
				Toast.makeText(this, "Operacao Cancelada", Toast.LENGTH_LONG).show();
				setResult(RESULT_CANCELED, getIntent());
			}

        	finish();
		}
		else if (requestCode == CANCELAMENTO_REDE_REQUEST) {
            Payment payment = data.getParcelableExtra(Intents.INTENT_EXTRAS_PAYMENT);
            Receipt receipt;
            
            if (payment.getStatus().equals(PaymentStatus.COMPLETED)) {
                Toast.makeText(this, "Payment Completed", Toast.LENGTH_LONG).show();
            } 
            else if (payment.getStatus().equals(PaymentStatus.AUTHORIZED)) {
                receipt = payment.getReceipt();
            }
			
			if (resultCode==Activity.RESULT_OK) {
				Toast.makeText(this, "Cancelamento OK", Toast.LENGTH_LONG).show();
				setResult(RESULT_OK, getIntent());
			} 
			else {
				Toast.makeText(this, "Operacao Cancelada", Toast.LENGTH_LONG).show();
				setResult(RESULT_CANCELED, getIntent());
			}
            
        	finish();
		}
		else if (requestCode == PAGAMENTO_CIELO_REQUEST || requestCode == CANCELAMENTO_CIELO_REQUEST) {
			if (resultCode == RESULT_OK) {
				Log.v("CDPOSDRVTELA", "[onActivityResult] RESULT_OK");
			} 
			else if (resultCode == 2) { // Parametros inv
				Log.v("CDPOSDRVTELA", "[onActivityResult] Parametro invalido");
			}
			else if (resultCode == 3) { // URL invalida
				Log.v("CDPOSDRVTELA", "[onActivityResult] URL invalida");
			} 
		}
		else if (requestCode == PAGAMENTO_REDE_REQUEST && resultCode == Activity.RESULT_OK) {
			if (data != null) {
				Payment payment = data.getParcelableExtra(Intents.INTENT_EXTRAS_PAYMENT);
				
				if (payment.getStatus().equals(PaymentStatus.COMPLETED)) {
					Toast.makeText(this, "Payment Completed", Toast.LENGTH_LONG).show();
				} 
				else if (payment.getStatus().equals(PaymentStatus.AUTHORIZED)) {
					Toast.makeText(this, "Payment Authorized", Toast.LENGTH_LONG).show();
				} 
				else if (payment.getStatus().equals(PaymentStatus.CANCELED)) {
					Toast.makeText(this, "Payment Canceled", Toast.LENGTH_LONG).show();
				} 
				else if (payment.getStatus().equals(PaymentStatus.FAILED)) {
					Toast.makeText(this, "Payment Failed", Toast.LENGTH_LONG).show();
				} 
				else if (payment.getStatus().equals(PaymentStatus.REFUNDED)){
					Toast.makeText(this, "Payment Failed", Toast.LENGTH_LONG).show();
				}
			}
		}
		else if (resultCode == Activity.RESULT_CANCELED) {
			Toast.makeText(this, "Payment Canceled", Toast.LENGTH_LONG).show();
		}
		
		super.onActivityResult(requestCode, resultCode, data);
	}
  
  public void DefineParametrosDTEFMobile(CDTEFMobile oDTEFMobile, String parameters)
  {
    String[] pars = parameters.split(";");
    for (int i = 0; i < pars.length; i++)
    {

      String par = pars[i];
      
      Log.v("CDPOSDRVTELA", "DefineParametrosDTEFMobile par="+par); 
      
      String[] keyvalues = par.split("=");
      String key = keyvalues[0];
      String value = keyvalues[1];

      Log.v("CDPOSDRVTELA", "DefineParametrosDTEFMobile key="+key + " - value=" +value); 
      oDTEFMobile.setParameter(key, value);     
    }   
  }
  
  public String ValorParametro(String parameters, String parameter)
  {
    Log.v("CDPOSDRVTELA", "ValorParametro parameters="+parameters + " - parameter = " + parameter); 
    
    String[] pars = parameters.split(";");
    for (int i = 0; i < pars.length; i++)
    {

      String par = pars[i];
      
      Log.v("CDPOSDRVTELA", "ValorParametro par="+par); 
      
      String[] keyvalues = par.split("=");
      String key = keyvalues[0];
      String value = keyvalues[1];

      Log.v("CDPOSDRVTELA", "ValorParametro key="+key + " - value=" +value); 
      
      if (key.equals(parameter))
        return value;
    }
    
    return "";
  }
  
  	public String ObtemParametrosRetorno(CDTEFMobile oDTEFMobile) {
  		String sParametros = "";
  		sParametros = "NSURede=" + oDTEFMobile.getParameter("NSURede") + "\n";
  		sParametros = sParametros + "CodigoRede=" + oDTEFMobile.getParameter("CodigoRede") + '\n';	            
  		sParametros = sParametros + "CodigoResposta=" + oDTEFMobile.getParameter("CodigoResposta") + '\n';
  		sParametros = sParametros + "CodigoAutorizacao=" + oDTEFMobile.getParameter("CodigoAutorizacao") + '\n';
  		sParametros = sParametros + "NumeroParcelas=" + oDTEFMobile.getParameter("NumeroParcelas") + '\n';
  		sParametros = sParametros + "NomeBandeira=" + oDTEFMobile.getParameter("NomeBandeira") + '\n';
  		sParametros = sParametros + "NumeroCartao=" + oDTEFMobile.getParameter("NumeroCartao") + '\n';
  		sParametros = sParametros + "TipoFinanciamento=" + oDTEFMobile.getParameter("TipoFinanciamento") + '\n';
  		sParametros = sParametros + "DataFiscal=" + oDTEFMobile.getParameter("DataFiscal") + '\n';
  		sParametros = sParametros + "HoraFiscal=" + oDTEFMobile.getParameter("HoraFiscal") + '\n';
  		sParametros = sParametros + "TipoOperacao=" + oDTEFMobile.getParameter("TipoOperacao") + '\n';
  		sParametros = sParametros + "IndiceCodigoRede=" + oDTEFMobile.getParameter("IndiceCodigoRede") + '\n';
  		sParametros = sParametros + "IndiceCodigoBandeira=" + oDTEFMobile.getParameter("IndiceCodigoBandeira") + '\n';
  		sParametros = sParametros + "CPFCliente=" + oDTEFMobile.getParameter("CPFCliente") + '\n';
  		sParametros = sParametros + "CodigoBarras=" + oDTEFMobile.getParameter("CodigoBarras") + '\n';
  		sParametros = sParametros + "CodigoBandeira=" + oDTEFMobile.getParameter("CodigoBandeira") + '\n';
  		sParametros = sParametros + "CodigoProdutoCielo=" + oDTEFMobile.getParameter("CodigoProdutoCielo") + '\n';
  		sParametros = sParametros + "CNPJRede=" + oDTEFMobile.getParameter("CNPJRede") + '\n';
  		sParametros = sParametros + "ValorDesconto=" + oDTEFMobile.getParameter("ValorDesconto") + '\n';
  		sParametros = sParametros + "ValorPago=" + oDTEFMobile.getParameter("ValorPago") + '\n';
  		sParametros = sParametros + "ValorParcela=" + oDTEFMobile.getParameter("ValorParcela") + '\n';
  		return sParametros;
  	}
  
	public void executaTransacao(final int iCodigoTransacao, String parameters) {
		//final CDTEFMobile oDTEFMobile = new CDTEFMobile();
    oDTEFMobile.setContext(this);
		final CDPOSDRVTELA oTransacaoActivity = this;

		// bloqueia rotacao da tela durante a transacao
		oTransacaoActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    final String sParametros = parameters;
    Log.v("CDPOSDRVTELA", "executaTransacao 1 parametros="+sParametros); 

		if (iCodigoTransacao == RECEBIMENTO_CIELO_MOBILE) {
			Intent intent = getIntent();
	
			// seta o activity da aplicacao
      oDTEFMobile.setPromptX(oTransacaoActivity);
			
			// seta o nome da aplicacao (necessario para o Cielo Mobile)
			oDTEFMobile.setParameter("NomeAplicacao", "DPOSAndroid");
			
			// seta o estabelecimento de venda cadastrado na Cielo
			oDTEFMobile.setParameter("CieloMobileEstVenda", "0000000000000001");
			
			// chama o "resumeTransaction" para finaliza a transacao
			oDTEFMobile.resumeTransaction("");

			String sRetorno = oDTEFMobile.getParameter("RetornoAplicacao"); 
	    	if (sRetorno != null && sRetorno.length() > 0) {
	    		intent.putExtra("RetornoAplicacao", sRetorno.toString());
	    	}
			
			String sNSU = oDTEFMobile.getParameter("NSU"); 
	    	if (sNSU != null && sNSU.length() > 0) {
	    		intent.putExtra("NSU", sNSU.toString());
	    	}

			String sComprovante = oDTEFMobile.getParameter("Comprovante"); 
	    	if (sComprovante != null && sComprovante.length() > 0) {
	    		intent.putExtra("Comprovante", sComprovante.toString());
	    	}
	    	
        	setResult(RESULT_OK, intent);
        	
        	finish();
			return;
		}


		if (iCodigoTransacao == -1) {
			oDTEFMobile.resumeTransaction("");
			//finish(); //finishing activity
			return;
		}
 
    Thread thread = new Thread()
    {
      @Override
      public void run() {   	    
      //oDTEFMobile.setParameter("TipoServidorTEF", "2"); //indica qual servidor utilizar (0-DTEF; 1-Sitef; 2-Cielo Mobile)
      oDTEFMobile.setParameter("NomeAplicacao", "DPOSAndroid");

      Log.v("CDPOSDRVTELA", "executaTransacao 2 iCodigoTransacao=" + iCodigoTransacao + " parametros="+sParametros); 
      
      if (!sParametros.equals(""))          
      {
        DefineParametrosDTEFMobile(oDTEFMobile, sParametros);
      }
      else
      {
        oDTEFMobile.setParameter("ValorTransacao", "0000");
        oDTEFMobile.setParameter("CupomFiscal", "00001");
        oDTEFMobile.setParameter("TipoServidorTEF", "0"); // D-TEF
      } 

      final int iResultado;
      if (iCodigoTransacao == -2)
      {
        // confirma
        Log.v("CDPOSDRVTELA", "executaTransacao Vai chamar confirmTransaction");
        int iNSU = Integer.parseInt(ValorParametro(sParametros, "NSUTransacao"));
        oDTEFMobile.setPromptX(oTransacaoActivity);
        iResultado = oDTEFMobile.confirmTransaction(iNSU);
      }
      else if (iCodigoTransacao == -3)
      {
        // desfaz
        Log.v("CDPOSDRVTELA", "executaTransacao Vai chamar undoTransaction");
        int iNSU = Integer.parseInt(ValorParametro(sParametros, "NSUTransacao"));
        oDTEFMobile.setPromptX(oTransacaoActivity);
        iResultado = oDTEFMobile.undoTransaction(iNSU);
      }
      else if (iCodigoTransacao == -4)
      {
        // finaliza
        Log.v("CDPOSDRVTELA", "executaTransacao Vai chamar finalizeTransaction");
        oDTEFMobile.setPromptX(oTransacaoActivity);
        iResultado = oDTEFMobile.finalizeTransaction();    	            		
      }
      else
      {  
        Log.v("CDPOSDRVTELA", "executaTransacao vai chamar oDTEFMobile.executeTransactionX"); 
        iResultado = oDTEFMobile.executeTransactionX(iCodigoTransacao, oTransacaoActivity);
      }
          
      Log.v("CDPOSDRVTELA", "executaTransacao resultado = " + iResultado); 

      runOnUiThread(new Runnable() {
        public void run() {
          Intent intent = getIntent();

          if (iResultado == 0)
          {
            if (iCodigoTransacao > 0)
            {
              final String sComprovante = oDTEFMobile.getParameter("Comprovante");
              final String sNSU = oDTEFMobile.getParameter("NSU"); 
              final String sMensagemErro = oDTEFMobile.getParameter("MensagemErro");
              intent.putExtra("NSU", sNSU.toString());    	            	
              intent.putExtra("Comprovante", sComprovante.toString());
            }
            
            JSONObject jsonobj = new JSONObject();
            try
            {
              jsonobj.put("NSU", oDTEFMobile.getParameter("NSU"));
              jsonobj.put("Comprovante", oDTEFMobile.getParameter("Comprovante"));
              jsonobj.put("CodigoResposta", oDTEFMobile.getParameter("CodigoResposta"));
              jsonobj.put("CodigoRede", oDTEFMobile.getParameter("CodigoRede"));
              jsonobj.put("CodigoBandeira", oDTEFMobile.getParameter("CodigoBandeira"));
              jsonobj.put("CodigoAutorizacao", oDTEFMobile.getParameter("CodigoAutorizacao"));
              jsonobj.put("NSURede", oDTEFMobile.getParameter("NSURede"));
              jsonobj.put("NumeroParcelas", oDTEFMobile.getParameter("NumeroParcelas"));
              jsonobj.put("NomeBandeira", oDTEFMobile.getParameter("NomeBandeira"));
              jsonobj.put("NumeroCartao", oDTEFMobile.getParameter("NumeroCartao"));
              jsonobj.put("TipoFinanciamento", oDTEFMobile.getParameter("TipoFinanciamento"));
              jsonobj.put("DataFiscal", oDTEFMobile.getParameter("DataFiscal"));
              jsonobj.put("HoraFiscal", oDTEFMobile.getParameter("HoraFiscal"));
              jsonobj.put("TipoOperacao", oDTEFMobile.getParameter("TipoFinanciamento"));
              jsonobj.put("IndiceCodigoRede", oDTEFMobile.getParameter("IndiceCodigoRede"));
              jsonobj.put("IndiceCodigoBandeira", oDTEFMobile.getParameter("IndiceCodigoBandeira"));
              jsonobj.put("CNPJRede", oDTEFMobile.getParameter("CNPJRede"));
              jsonobj.put("MensagemErro", oDTEFMobile.getParameter("MensagemErro"));
              jsonobj.put("ValorPago", oDTEFMobile.getParameter("ValorPago"));
            }
            catch (Exception e)
            {
            }

            Log.v("CDPOSDRVTELA", "executaTransacao Vai chamar  setResult 1");
            intent.putExtra("Parameters", jsonobj.toString());
            setResult(Activity.RESULT_OK, intent);
            Log.v("CDPOSDRVTELA", "executaTransacao chamou setResult 2");
            finish();
            Log.v("CDPOSDRVTELA", "executaTransacao Chamou finish 3");
          }
          else
          {
            JSONObject jsonobj = new JSONObject();
            try
            {
              jsonobj.put("MensagemErro", oDTEFMobile.getParameter("MensagemErro"));
            }
            catch (Exception e)
            {
            }

            Log.v("CDPOSDRVTELA", "executaTransacao Vai chamar  setResult 4");
            intent.putExtra("Parameters", jsonobj.toString());
            setResult(Activity.RESULT_CANCELED, intent);
            Log.v("CDPOSDRVTELA", "executaTransacao Vai chamar  finish 5");
            finish();
            Log.v("CDPOSDRVTELA", "executaTransacao Chamou finish 6");
          }
        } 
      }); 
      }
    };
   	thread.start();

	}    
	
	public void executaTransacaoEspecial(final int iCodigoTransacao, String parameters) {
		//final CDTEFMobile oDTEFMobile = new CDTEFMobile();
		oDTEFMobile.setContext(this);
		final CDPOSDRVTELA oTransacaoActivity = this;

		// bloqueia rotacao da tela durante a transacao
		oTransacaoActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		
    	Thread thread = new Thread()
    	{
    	    @Override
    	    public void run() {
    	    	// limpa as variavei da transacao anterior
    	    	oDTEFMobile.clearParameters();
    	    	
    			// input da estrutura com os dados que devem ser coletados no pinpad  
    			oDTEFMobile.setParameter("TransacaoEspecialDadosEntrada", "111101"); // coleta de CPF
    			
    			final int iResultado = oDTEFMobile.executeTransactionSpecial(iCodigoTransacao, oTransacaoActivity);

    			// put your code in here to handle the event
    		    switch (iCodigoTransacao) {
    		        case TRANSACAO_ESPECIAL_COLETA_INFORMACAO_PINPAD:
    	    	    	final String sDadosRetorno = oDTEFMobile.getParameter("TransacaoEspecialDadosSaida");
    	    	    	
    	    	        runOnUiThread(new Runnable() {
    	    	            public void run() {
    	    	            	Intent intent = getIntent();
    	    	            	
    	    	            	if (iResultado == 0)
    	    	            	{
    	    	            		intent.putExtra("TransacaoEspecialDadosSaida", sDadosRetorno.toString());
    	        	            	setResult(RESULT_OK, intent);
    	    	            	}

    	    	            	finish();
    	    	            }    
    	    	        });
    		        	break;
    		    }    			
    	    }
    	};
    	
    	thread.start();
	}
	
	public void finalizaTransacao(final int iCodigoTransacao) {
		//final CDTEFMobile oDTEFMobile = new CDTEFMobile();
		oDTEFMobile.setContext(this);
		final CDPOSDRVTELA oTransacaoActivity = this;

	    final String sNSU = leInfo("NSU");
	    if (sNSU == null || sNSU.equals("")) {
        	Intent intent = getIntent();
        	setResult(RESULT_OK, intent);
        	finish();
	    	return;
	    }
		
    	Thread thread = new Thread()
    	{
    	    @Override
    	    public void run() {
            	Intent intent = getIntent();
	        	int iNSU = Integer.parseInt(sNSU);

	        	oDTEFMobile.setPromptX(oTransacaoActivity);

				// put your code in here to handle the event
			    switch (iCodigoTransacao) {
			        case TRANSACAO_CONFIRMACAO:
		            	oDTEFMobile.confirmTransaction(iNSU);
		            	break;
			        case TRANSACAO_DESFAZIMENTO:
		            	oDTEFMobile.undoTransaction(iNSU);
		            	break;
			    }    			
		    	
	        	oDTEFMobile.finalizeTransaction();
	        	
            	setResult(RESULT_OK, intent);
            	finish();
    	    }
    	};
    	
    	thread.start();
	}
	
	private void gravaInfo(String sNome, String sValor) {
		SharedPreferences.Editor editor = spDados.edit();
		editor.putString(sNome, sValor);
		editor.commit();
	}

	private String leInfo(String sNome) {
		SharedPreferences.Editor editor = spDados.edit();
		String sValue = spDados.getString(sNome, "");
		return sValue;
	}
	
	public void limpaDisplayTerminal() 
    {
        Log.v("CDPOSDRVTELA", "limpaDisplayTerminal inicio");
        runOnUiThread(new Runnable() {
            public void run() {
             	TextView txt=(TextView)findViewById(fakeR.getId("id", "textTerminal"));
             	txt.setText("");
            }    
       }); 		  
       
       Log.v("CDPOSDRVTELA", "limpaDisplayTerminal fim");
    }
    
    public void displayTerminal(String sMensagem)
    {
        Log.v("CDPOSDRVTELA", "displayTerminal inicio sMensagem=" + sMensagem);
    	final String sMens=sMensagem;
        runOnUiThread(new Runnable() {
        	@Override
            public void run() {
             	TextView txt=(TextView)findViewById(fakeR.getId("id", "textTerminal"));
             	txt.setTextColor(Color.WHITE);             	
             	txt.setText(sMens);
            }    
       }); 		  

       Log.v("CDPOSDRVTELA", "displayTerminal fim sMensagem=" + sMensagem);
    }

    public void displayErro(String sMensagem)
    {
        Log.v("CDPOSDRVTELA", "displayErro inicio sMensagem=" + sMensagem);
    	final String sMens=sMensagem;
        runOnUiThread(new Runnable() {
        	@Override
            public void run() {
             	TextView txt=(TextView)findViewById(fakeR.getId("id", "textTerminal"));
             	txt.setTextColor(Color.RED);
             	txt.setText(sMens);
    			try { Thread.sleep(2000); } catch (InterruptedException e) { }
            }    
       }); 		     	
        Log.v("CDPOSDRVTELA", "displayErro fim sMensagem=" + sMensagem);
    }
    
    public void mensagem(String sMensagem)
    {
        Log.v("CDPOSDRVTELA", "mensagem inicio sMensagem=" + sMensagem);
    	displayTerminal(sMensagem);
        Log.v("CDPOSDRVTELA", "mensagem fim sMensagem=" + sMensagem);
    }
    
    public int solicitaConfirmacao(String sMensagem)
    {   	    	
        Log.v("CDPOSDRVTELA", "solicitaConfirmacao inicio sMensagem=" + sMensagem);
    	final String sMens=sMensagem;
    	iRetorno=0;   	    	    	
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	
        android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
        // Create and show the dialog.
        ConfirmacaoDialog FragmentConf = new ConfirmacaoDialog();  
        if (sMens.length() == 0)
        	FragmentConf.bSomenteUmBotao = true;
        else
        {
        	FragmentConf.bSomenteUmBotao = false;
        FragmentConf.setMensagem(sMens);
        }
        FragmentConf.show(ft, "");
        while(FragmentConf.getOpcaoSelecionada()==false);
        if(FragmentConf.getConfirmado())
          iRetorno=0;
        else
          iRetorno=1;            	                            
        
        Log.v("CDPOSDRVTELA", "solicitaConfirmacao fim sMensagem=" + sMensagem + " resultado = " + String.valueOf(iRetorno));
        return iRetorno;
    }
    
    public void mensagemAlerta(String sMensagem)
    {
        Log.v("CDPOSDRVTELA", "mensagemAlerta inicio sMensagem=" + sMensagem);
    	final String sMens=sMensagem;
    	iRetorno=0;
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);   	    	    	
        android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
        // Create and show the dialog.
        ConfirmacaoDialog FragmentConf = new ConfirmacaoDialog();
        FragmentConf.bSomenteUmBotao=true;
        FragmentConf.setMensagem(sMens);
        FragmentConf.show(ft, "");
        while(FragmentConf.getOpcaoSelecionada()==false);
        Log.v("CDPOSDRVTELA", "mensagemAlerta fim sMensagem=" + sMensagem);
    }
    
    public CRetorno entraCartao(String sLabel, String numeroCartao)
    {
        Log.v("CDPOSDRVTELA", "entraCartao inicio sLabel=" + sLabel + " numeroCartao = " + numeroCartao);
    	// CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.  
    	// CRetorno.sStringRetorno = se iResultado=0 retorno numero do cartao caso contrario string vazia
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        CFragmentNumero FragEntraNumero = new CFragmentNumero();
        FragEntraNumero.cdposdrvtela =  CDPOSDRVTELA.this;
        bOKPressionado = false;
        bCancelPressionado = false;        
    	FragEntraNumero.sLabel = sLabel;
    	FragEntraNumero.sValorInicial = numeroCartao;
    	FragEntraNumero.sNumeroMinimo = "0";
    	FragEntraNumero.sNumeroMaximo = "0";
    	FragEntraNumero.iMinimoDigitos = 11;
    	FragEntraNumero.iMaximoDigitos = 19;
    	FragEntraNumero.iDigitosExatos = 0;    
        fragmentTransaction.replace(fakeR.getId("id", "fragment_container"), FragEntraNumero);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

    	EditText edtNum = (EditText) findViewById(fakeR.getId("id", "edtNumero")); 
    	if(edtNum!=null)
    	{
    		InputFilter[] FilterArray = new InputFilter[1];
    		FilterArray[0] = new InputFilter.LengthFilter(19);
    		edtNum.setFilters(FilterArray);
    	}
    	
 
        while(true)
        {
        	if(CancelPressionado())
        		break;
        	if(OKPressionado())
        	{
		 		edtNum = (EditText) findViewById(fakeR.getId("id", "edtNumero"));
		 		int iTam = edtNum.getText().length();
        		
        		if (iTam < FragEntraNumero.iMinimoDigitos)
        		{
        			String sAux = new String("");
        			
        			if (iTam > 0) {
        				sAux = edtNum.getText().toString().substring(0, iTam);
        			edtNum.setText(sAux);
        			edtNum.setSelection(sAux.length());        			
        			}
        			
        			bOKPressionado=false;
        			continue;
        		}
        		
        		if(edtNum.getText().length() > FragEntraNumero.iMaximoDigitos)
        		{
        			String sAux;
        			sAux = edtNum.getText().toString().substring(0,FragEntraNumero.iMaximoDigitos);
        			edtNum.setText(sAux);
        			edtNum.setSelection(sAux.length());        			        			
        			bOKPressionado=false;
        			continue;
        		}
        		break;
        	}
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }  
        
        CRetorno cretorno = new CRetorno();

        if(OKPressionado())
        {
        	cretorno.setStringRetorno(FragEntraNumero.numeroCartaoDigitado());
        	cretorno.setResultado(0);
        	cretorno.setIntRetorno(0);
        }
        else
        {
        	cretorno.setStringRetorno("");
        	cretorno.setResultado(-1);
        	cretorno.setIntRetorno(-1);
        }      
        limpaTela();
        Log.v("CDPOSDRVTELA", "entraCartao fim sLabel=" + sLabel + " numeroCartao = " + numeroCartao + " retorno.string = " + cretorno.getStringRetorno() + " resultado = " + cretorno.getResultado());
    	return cretorno;    	   
    }
       
    public CRetorno entraDataValidade(String sLabel,String dataValidade)
    {
        Log.v("CDPOSDRVTELA", "entraDataValidade inicio sLabel=" + sLabel + " dataValidade = " + dataValidade);
        
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	
    	
		  CRetorno oRetorno = entraMascara(false, 0, 0, 0, false,sLabel,"  /  ",dataValidade,true);		  		  

		String sRetorno = oRetorno.getStringRetorno();
		
		// remove o delimitador da data do buffer de retorno
		if (oRetorno.getResultado() == 0 && oRetorno.getStringRetorno().length() > 4 && sRetorno.contains("/")) {
			String sDataVencimento = sRetorno.substring(0, 2) + sRetorno.substring(3, 5);
			oRetorno.setStringRetorno(sDataVencimento);
		}
		
        Log.v("CDPOSDRVTELA", "entraCartao fim sLabel=" + sLabel + " dataValidade = " + dataValidade + " retorno.string = " + oRetorno.getStringRetorno() + " resultado = " + oRetorno.getResultado());
      return oRetorno;
    }
    
    public CRetorno entraData(String sLabel, String data)
    {
        Log.v("CDPOSDRVTELA", "entraData inicio sLabel=" + sLabel + " data = " + data);
        
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	
    	
      CRetorno oRetorno = entraMascara(false, 0, 0, 0, false,sLabel,"  /  /  ",data,true);		  		      	
        Log.v("CDPOSDRVTELA", "entraData(1) sLabel=" + sLabel + " data = " + data + " retorno.string = [" + oRetorno.getStringRetorno() + "] resultado = " + oRetorno.getResultado());
        
        String sStringRetorno = oRetorno.getStringRetorno();
        
		// inclui o delimitador da data se nao existir (deve retornar no formato "dd/mm/yy"
		if (sStringRetorno.length() > 0 && !sStringRetorno.contains("/")) {
			String sData = sStringRetorno.substring(0, 2) + "/" + sStringRetorno.substring(2, 4) + "/" + sStringRetorno.substring(4, 6); 
			oRetorno.setStringRetorno(sData);
		}        
        
		Log.v("CDPOSDRVTELA", "entraData(2) sLabel=" + sLabel + " data = " + data + " retorno.string = [" + oRetorno.getStringRetorno() + "] resultado = " + oRetorno.getResultado());
      return oRetorno;
    }
    
    public CRetorno entraCodigoSeguranca(String sLabel,String codigoSeguranca,int iTamanhoMax)
    {
    	// CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.  
    	// CRetorno.sStringRetorno = Codigo de Seguranca se iResultado=0 caso contrario string vazia.
        Log.v("CDPOSDRVTELA", "entraData inicio sLabel=" + sLabel + " codigoSeguranca = " + codigoSeguranca + " iTamanhoMax = " + iTamanhoMax);
    	EditText edtNum = (EditText) findViewById(fakeR.getId("id", "edtCodigoSeguranca"));
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        CFragmentCodigoSeguranca FragCodigoSeg = new CFragmentCodigoSeguranca();
        FragCodigoSeg.cdposdrvtela =  CDPOSDRVTELA.this;
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	    	
    	FragCodigoSeg.sLabel = sLabel;
    	FragCodigoSeg.sValorInicial = codigoSeguranca;
    	FragCodigoSeg.iTamanhoMaximoDigitos  =  iTamanhoMax;
       	          	
    	
        fragmentTransaction.replace(fakeR.getId("id", "fragment_container"), FragCodigoSeg);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        
        edtNum = (EditText) findViewById(fakeR.getId("id", "edtCodigoSeguranca"));
        
    	if(edtNum!=null)
    	{
    		InputFilter[] FilterArray = new InputFilter[1];
    		FilterArray[0] = new InputFilter.LengthFilter(iTamanhoMax);
    		edtNum.setFilters(FilterArray);
    	} 
        
        while(true)
        {
        	if(CancelPressionado())
        		break;
        	if(OKPressionado())
        	{        		
       			break;        			
        	}
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }  
        
        CRetorno cretorno = new CRetorno();

        if(OKPressionado())
        {
        	cretorno.setStringRetorno(FragCodigoSeg.getcodigoSeguranca());
        	cretorno.setResultado(0);
        	cretorno.setIntRetorno(0);
        }
        else
        {
        	cretorno.setStringRetorno("");
        	cretorno.setResultado(-1);
        	cretorno.setIntRetorno(-1);
        }      
        
        limpaTela();
        Log.v("CDPOSDRVTELA", "entraCodigoSeguranca fim sLabel=" + sLabel + " codigoSeguranca = " + codigoSeguranca + " iTamanhoMax = " + iTamanhoMax + " retorno.string = " + cretorno.getStringRetorno() + " resultado = " + cretorno.getResultado());
    	return cretorno;    		
    }
    
    public CRetorno selecionaOpcao(String sLabel, String sOpcoes, int opcao)
    {    	    
    	// CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.
    	// CRetorno.iRetorno = indice da opcao do menu (Comecando por 1).  
    	// CRetorno.sStringRetorno = ""    	
    	// Exemplo de Entrada: (1,\"1-A Vista\")#(2,\"2-Financ.ADM\")#(3,\"3-Financ.Loja\")
        Log.v("CDPOSDRVTELA", "selecionaOpcao inicio sLabel=" + sLabel + " sOpcoes = " + sOpcoes + " opcao = " + opcao);

    	int iPos,iContador,i;
    	String sOpcoesAux,sOpcao,sTemp;
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);
    	CRetorno cRet=new CRetorno();
     	android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
        // Create and show the dialog.
     	OpcoesDialog newOpcoesDialog = new OpcoesDialog ();
        newOpcoesDialog.setMensagem(sLabel);
        newOpcoesDialog.iOpcaoSelecionada = opcao;        
    	newOpcoesDialog.cdposdrvtela =  CDPOSDRVTELA.this;
    	iPos=0;
    	iContador=0;
    	sOpcoesAux=sOpcoes;
    	
    	while(iPos!=-1)
    	{
    		iPos=sOpcoesAux.indexOf(")#(");
    		if(iPos>=0)
    		{
    			iContador++;
    			if((iPos+3)>sOpcoesAux.length())
    			{       			
    				break;
    			}
    			sOpcoesAux=sOpcoesAux.substring((iPos+3),sOpcoesAux.length());
    		}
    	}
    	
    	String[] sOpcoesx = new String[iContador+1]; 
    	iPos=0;
    	iContador=0;
    	sOpcoesAux=sOpcoes;
    	
    	while(iPos!=-1)
    	{
    	    iPos = sOpcoesAux.indexOf(")#(");
    	    if (iPos <= 0)
    	    {
    	      i = sOpcoesAux.indexOf(",\"");
    	      sOpcao =sOpcoesAux.substring(i + 2, sOpcoesAux.length() - 3 + 1);    	      
    	    }
    	    else
    	    {
    	      sTemp = sOpcoesAux.substring(1, iPos);
    	      i = sTemp.indexOf(",\"");
    	      sOpcao = sTemp.substring(i + 2, (sTemp.length() - 3 + 2));
    	    }
			
			sOpcoesx[iContador] = sOpcao;
			iContador++;

    	    if (iPos <= 0)
    	      break;
    	    else
    	    {
    	    	if((iPos+2) <  sOpcoesAux.length())
    	    		sOpcoesAux = sOpcoesAux.substring(iPos + 2, sOpcoesAux.length());
    	    }
    	}    	
        	    	
    	newOpcoesDialog.setOpcoes(sOpcoesx);
        newOpcoesDialog.show(ft, "");
        
        while(true)
        {
        	if(CancelPressionado())
        		break;
        	if(OKPressionado())
        		break;
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }  
        
        if(CancelPressionado())
        {
        	cRet.setResultado(-1);
        	cRet.setStringRetorno("");
        }
        else
        {
        	cRet.setResultado(0);
        	cRet.setIntRetorno(newOpcoesDialog.iOpcaoSelecionada);
        	cRet.setStringRetorno("");
        } 
        
        Log.v("CDPOSDRVTELA", "selecionaOpcao fim sLabel=" + sLabel + " sOpcoes = " + sOpcoes + " opcao = " + opcao + " retorno.string = " + cRet.getStringRetorno() + " resultado = " + cRet.getResultado());
    	return cRet;
    }
    
    public CRetorno selecionaOpcaoEx(String sLabel, String sOpcoes,int opcaoSelecionada, String identificador)
    {
        Log.v("CDPOSDRVTELA", "selecionaOpcaoEx inicio sLabel=" + sLabel + " sOpcoes = " + sOpcoes + " opcaoSelecionada = " + opcaoSelecionada + " identificador=" + identificador);

        // Retorno:
    	// CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.
    	// CRetorno.iRetorno = indice da opcao do menu (Comecando por 1).
    	// CRetorno.sStringRetorno = identificador que foi passado para o item do menu selecionado 
    	// Exemplo de Entrada: (1,\"1-A Vista\",100)#(2,\"2-Financ.ADM\",200)#(3,\"3-Financ.Loja\",300)
    	int iPos,iContador,iIni,iFim;
    	String sOpcoesAux,sOpcao,sTemp,sIdentificador="";
    	CRetorno cRet=new CRetorno();
     	android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
        // Create and show the dialog.
     	OpcoesDialog newOpcoesDialog = new OpcoesDialog ();
        newOpcoesDialog.setMensagem(sLabel);
        newOpcoesDialog.iOpcaoSelecionada = opcaoSelecionada;
        newOpcoesDialog.identificador = identificador;
    	newOpcoesDialog.cdposdrvtela =  CDPOSDRVTELA.this;
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	    	    	
    	iPos=0;
    	iContador=0;
    	sOpcoesAux=sOpcoes;
    	
    	while(iPos!=-1)
    	{
    		iPos=sOpcoesAux.indexOf(")#(");
    		if(iPos>=0)
    		{
    			iContador++;
    			if((iPos+3)>sOpcoesAux.length())
    			{       			
    				break;
    			}
    			sOpcoesAux=sOpcoesAux.substring((iPos+3),sOpcoesAux.length());
    		}
    	}
    	
    	String[] sOpcoesx = new String[iContador+1]; 
    	String[] sOpcoesIdentificadores = new String[iContador+1];
    	iPos=0;
    	iContador=0;
    	sOpcoesAux=sOpcoes;
    	
    	while(iPos!=-1)
    	{
    	    iPos = sOpcoesAux.indexOf(")#(");
    	    if (iPos <= 0)
    	    {
    	      iIni = sOpcoesAux.indexOf(",\"");
    	      sOpcao =sOpcoesAux.substring(iIni + 2, sOpcoesAux.length() - 1);  
    	      iFim = sOpcao.indexOf("\"");
    	      sTemp = sOpcao;
    	      sOpcao = sTemp.substring(0,iFim);    	      
    	      sIdentificador = sTemp.substring(iFim+2,sTemp.length());    	      
    	    }
    	    else
    	    {
    	      sTemp = sOpcoesAux.substring(1, iPos);
    	      iIni = sTemp.indexOf(",\"");
    	      sOpcao = sTemp.substring(iIni + 2, (sTemp.length()));
    	      iFim = sOpcao.indexOf("\",");
    	      sTemp = sOpcao;
    	      sOpcao = sTemp.substring(0,iFim);    	      
    	      sIdentificador = sTemp.substring(iFim+2,sTemp.length());
    	    }
			
			sOpcoesx[iContador] = sOpcao;
			sOpcoesIdentificadores[iContador] = sIdentificador;
			iContador++;

    	    if (iPos <= 0)
    	      break;
    	    else
    	    {
    	    	if((iPos+2) <  sOpcoesAux.length())
    	    		sOpcoesAux = sOpcoesAux.substring(iPos + 2, sOpcoesAux.length());
    	    }
    	}    	
        	    	
    	newOpcoesDialog.setOpcoes(sOpcoesx);
        newOpcoesDialog.show(ft, "");
        
        while(true)
        {
        	if(CancelPressionado())
        		break;
        	if(OKPressionado())
        		break;
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }  
        
        if(CancelPressionado())
        {
        	cRet.setResultado(-1);
        	cRet.setStringRetorno("Cancelada");
        }
        else
        {
        	cRet.setResultado(0);
        	cRet.setIntRetorno(newOpcoesDialog.iOpcaoSelecionada);
        	if(cRet.getIntRetorno() > 0)
        		cRet.setStringRetorno(sOpcoesIdentificadores[(cRet.getIntRetorno()-1)]);
        } 
        
        Log.v("CDPOSDRVTELA", "selecionaOpcaoEx fim sLabel=" + sLabel + " sOpcoes = " + sOpcoes + " opcaoSelecionada = " + opcaoSelecionada + " identificador=" + identificador + " retorno.string = " + cRet.getStringRetorno() + " resultado = " + cRet.getResultado());
    	return cRet;    	
    }
    
    public CRetorno entraValor(String sLabel,String sValor, String sValorMinimo, String sValorMaximo)
    {
        Log.v("CDPOSDRVTELA", "entraValor inicio sLabel=" + sLabel + " sValor = " + sValor + " sValorMinimo=" + sValorMinimo + " sValorMaximo=" + sValorMaximo);

        // CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.  
    	// CRetorno.sStringRetorno = se iResultado=0 retorna valor (somente numeros) caso contrario string vazia
      
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        CFragmentValor FragEntraValor = new CFragmentValor();
        FragEntraValor.cdposdrvtela =  CDPOSDRVTELA.this;
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	    	
    	FragEntraValor.sLabel = sLabel;
    	FragEntraValor.sValor = sValor;
    	FragEntraValor.sValorMinimo = sValorMinimo;
    	FragEntraValor.sValorMaximo = sValorMaximo;
        fragmentTransaction.replace(fakeR.getId("id", "fragment_container"), FragEntraValor);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
                     
        while(true)
        {
        	if(CancelPressionado())
        		break;
        	if(OKPressionado())
        		break;
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }  
        
        CRetorno cretorno = new CRetorno();

        if(OKPressionado())
        {
        	cretorno.setStringRetorno(FragEntraValor.sStringValor());
        	cretorno.setResultado(0);
        	cretorno.setIntRetorno(0);
        }
        else
        {
        	cretorno.setStringRetorno("");
        	cretorno.setResultado(-1);
        	cretorno.setIntRetorno(-1);
        }      
        
        limpaTela();
        Log.v("CDPOSDRVTELA", "entraValor fim sLabel=" + sLabel + " sValor = " + sValor + " sValorMinimo=" + sValorMinimo + " sValorMaximo=" + sValorMaximo + " retorno.string = " + cretorno.getStringRetorno() + " resultado = " + cretorno.getResultado());
    	return cretorno;    	
    }
    
    public CRetorno entraNumero(String sLabel, String sNumero,String sNumeroMinimo, String sNumeroMaximo, int iMinimoDigitos, int iMaximoDigitos, int iDigitosExatos)
    {
        Log.v("CDPOSDRVTELA", "entraNumero inicio sLabel=" + sLabel + " sNumero = " + sNumero + " sNumeroMinimo=" + sNumeroMinimo + " sNumeroMaximo=" + sNumeroMaximo + " iMinimoDigitos=" + iMinimoDigitos + " iMaximoDigitos=" + iMaximoDigitos + " iDigitosExatos=" + iDigitosExatos);

    // CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.  
    	// CRetorno.sStringRetorno = se iResultado=0 retorno numero caso contrario string vazia
    	
    	//int iValorDigitado;
    	//int iValor;
    	EditText edtNum;
    	
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        CFragmentNumero FragEntraNumero = new CFragmentNumero();
        FragEntraNumero.cdposdrvtela =  CDPOSDRVTELA.this;
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	    	
    	FragEntraNumero.sLabel = sLabel;
    	FragEntraNumero.sValorInicial = sNumero;
    	FragEntraNumero.sNumeroMinimo = sNumeroMinimo;
    	FragEntraNumero.sNumeroMaximo = sNumeroMaximo;
    	FragEntraNumero.iMinimoDigitos = iMinimoDigitos;
    	FragEntraNumero.iMaximoDigitos = iMaximoDigitos;
    	FragEntraNumero.iDigitosExatos = iDigitosExatos;    
        fragmentTransaction.replace(fakeR.getId("id", "fragment_container"), FragEntraNumero);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        
        edtNum = (EditText) findViewById(fakeR.getId("id", "edtNumero"));    	
        
        if(iDigitosExatos!=0 || iMaximoDigitos!=0)
        {	
        	if(edtNum!=null)
        	{
        		InputFilter[] FilterArray = new InputFilter[1];
        		if(iDigitosExatos!=0)
        			FilterArray[0] = new InputFilter.LengthFilter(iDigitosExatos);
        		else
        			FilterArray[0] = new InputFilter.LengthFilter(iMaximoDigitos);        			
        		edtNum.setFilters(FilterArray);  
        	}
        }
        
        while(true)
        {
        	if(CancelPressionado())
        		break;
        		
        	if(OKPressionado())
        		break;
        	
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }  
        
        CRetorno cretorno = new CRetorno();

        if(OKPressionado())
        {
        	cretorno.setStringRetorno(FragEntraNumero.numeroCartaoDigitado());
        	cretorno.setResultado(0);
        	cretorno.setIntRetorno(0);
        }
        else
        {
        	cretorno.setStringRetorno("");
        	cretorno.setResultado(-1);
        	cretorno.setIntRetorno(-1);
        }      
        limpaTela();        
        Log.v("CDPOSDRVTELA", "entraNumero fim sLabel=" + sLabel + " sNumero = " + sNumero + " sNumeroMinimo=" + sNumeroMinimo + " sNumeroMaximo=" + sNumeroMaximo + " iMinimoDigitos=" + iMinimoDigitos + " iMaximoDigitos=" + iMaximoDigitos + " iDigitosExatos=" + iDigitosExatos + " retorno.string = " + cretorno.getStringRetorno() + " resultado = " + cretorno.getResultado());
    	return cretorno;    	
    }

   
    public CRetorno entraString(String sLabel, int iLimpaBuffer, String stringEntrada, int iMinimoDigitos, int iMaximoDigitos, int iColetaSecreta)
    {
    	// CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.  
    	// CRetorno.sStringRetorno = se iResultado=0 retorna String digitada caso contrario string vazia
        Log.v("CDPOSDRVTELA", "entraString inicio sLabel=" + sLabel + " iLimpaBuffer = " + iLimpaBuffer + " stringEntrada=" + stringEntrada + " iMinimoDigitos=" + iMinimoDigitos + " iMaximoDigitos=" + iMaximoDigitos + " iColetaSecreta=" + iColetaSecreta);
    	
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	    	
        
        CFragmentString FragEntraString = new CFragmentString();
        FragEntraString.cdposdrvtela =  CDPOSDRVTELA.this;
        FragEntraString.sLabel = sLabel;
        FragEntraString.sStringInicial = stringEntrada;
        FragEntraString.iMinimoDigitos = iMinimoDigitos;
        FragEntraString.iMaximoDigitos = iMaximoDigitos;
        FragEntraString.iLimpaBuffer=iLimpaBuffer;
        FragEntraString.iColetaSecreta = iColetaSecreta;
        fragmentTransaction.replace(fakeR.getId("id", "fragment_container"), FragEntraString);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        
        //while(!OKPressionado() && !CancelPressionado());
        while(true)
        {
        	if(CancelPressionado())
        		break;
        	
        	if(OKPressionado())
        		break;
        	
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }          
        
        CRetorno cretorno = new CRetorno();

        if(OKPressionado())
        {
        	cretorno.setStringRetorno(FragEntraString.stringDigitada());
        	cretorno.setResultado(0);
        	cretorno.setIntRetorno(0);
        }
        else
        {
        	cretorno.setStringRetorno("");
        	cretorno.setResultado(-1);
        	cretorno.setIntRetorno(-1);
        }      
        
        limpaTela();        
        Log.v("CDPOSDRVTELA", "entraString fim sLabel=" + sLabel + " iLimpaBuffer = " + iLimpaBuffer + " stringEntrada=" + stringEntrada + " iMinimoDigitos=" + iMinimoDigitos + " iMaximoDigitos=" + iMaximoDigitos + " iColetaSecreta=" + iColetaSecreta + " retorno.string = " + cretorno.getStringRetorno() + " resultado = " + cretorno.getResultado());
    	return cretorno;    	
    }
    
    public CRetorno entraMascara(boolean bLimpaTela,int iColLabel,int iLinLabel,int iLinColeta,boolean iLimpaBuffer,String sLabel,String sMascara,String stringEntrada,boolean bPermiteEntra)
    {
//    	/*
    	// CRetorno.iResultado = 0 se operacao OK ou -1 se operacao foi cancelada.  
    	// CRetorno.sStringRetorno = se iResultado=0 retorno string digitada caso contrario string vazia    	
    	FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        CFragmentMascara FragEntraMascara = new CFragmentMascara();
        FragEntraMascara.cdposdrvtela =  CDPOSDRVTELA.this;
    	setaOperacaoCancelada(false);
    	setaOKPressionado(false);    	    	
        FragEntraMascara.bLimpaTela = bLimpaTela;
        FragEntraMascara.iColLabel = iColLabel;
        FragEntraMascara.iLinLabel = iLinLabel;
        FragEntraMascara.iLinColeta = iLinColeta;
        FragEntraMascara.iLimpaBuffer = iLimpaBuffer;
        FragEntraMascara.sLabel = sLabel; 
        FragEntraMascara.sMascara = sMascara;
        FragEntraMascara.bPermiteEntra = bPermiteEntra;
        FragEntraMascara.sLabel = sLabel;
        FragEntraMascara.sMascara = sMascara;
        FragEntraMascara.stringEntrada = stringEntrada;
        FragEntraMascara.iLimpaBuffer = iLimpaBuffer;
        fragmentTransaction.replace(fakeR.getId("id", "fragment_container"), FragEntraMascara);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
        
        //while(!OKPressionado() && !CancelPressionado());
        while(true)
        {
        	if(CancelPressionado())
        		break;
        	
        	if(OKPressionado())
        		break;
        	
        	try 
        	{ 
          	  Thread.sleep(100);        	
        	}
        	catch (InterruptedException e)	{ }
        }          
          
        CRetorno cretorno = new CRetorno();

        if(OKPressionado())
        {
        	cretorno.setStringRetorno(FragEntraMascara.stringDigitada());
          	cretorno.setResultado(0);
          	cretorno.setIntRetorno(0);
        }
        else
        {
          	cretorno.setStringRetorno("");
          	cretorno.setResultado(-1);
          	cretorno.setIntRetorno(-1);
        
        }      
        limpaTela();
      	return cretorno;        	
    }
    
    public int operacaoCancelada()
    {   	    	
    	if(bCancelPressionado)
    		return 1;
    	else 
    		return 0;
    }
    
    public int setaOperacaoCancelada(boolean bCancelada)
    {
    	bCancelPressionado = bCancelada;
    	return 0;
    }
    
    public boolean OKPressionado()
    {
    	return bOKPressionado;
    }
    
    public void setaOKPressionado(boolean bOK)
    {
    	bOKPressionado=bOK;
    }
    
    public boolean CancelPressionado()
    {
    	return bCancelPressionado; 
    }
      
    
	 public void beep()
	 {
		 ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50);
	     toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 1000); // 1000 is duration in ms
	 }
	 
	 public void limpaTela()
	 {
	    FragmentManager fragmentManager = getFragmentManager();
	    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
	    CFragmentLimpaTela FragLimpaTela = new CFragmentLimpaTela();
	    FragLimpaTela.cdposdrvtela =  CDPOSDRVTELA.this;
	    fragmentTransaction.replace(fakeR.getId("id", "fragment_container"), FragLimpaTela);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();	 
	 }
    
}

