 public class MainActivity extends Activity {

	public static String EXTRA_MESSAGE="com.my_example.myfirstapp.MESSAGE";
	public static int myTxtColor = 0;
	public static int myTxtSize = 20;
	public static String stringToPut ="";
	public int in_abs = 0;
	public int unary = 1;
	public int error = 0;
	
	public static class m extends Object{
	}
	
	public static class StringC { public String in; };
	void fillString (StringC ss, String vstup ) {
	
		ss.in = vstup;
	}
	public StringC cc;
	
	public static void AddToString (String a){
		
		MainActivity.stringToPut = MainActivity.stringToPut + a;
		
	}
	
	public static void Set_String (){
		
		MainActivity.stringToPut = "";
		
	}
	


 public double eval_number ( StringC c ){
	  
	  String newString = null;
	  String in_s = newString ;
	  double num;
	  int i;
	  double expression;
	  double exponent;
	  i = 0;

	   for (i=0; (((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) || (c.in.charAt(i)=='.'));i++);
//	   		   in_s[i]=in.charAt(i+1);
	   in_s = c.in.substring( 0,i );
	   String new_in = new String (in_s);
	   num = Double.parseDouble (new_in);
	   in_s = c.in.substring( i );
	   c.in = in_s;

	   return num;
//	   }
//	  return num;
 }
  
  
  public double eval_factor ( StringC c ){
	
	  double factor;
	  double exponent;
	  String newString = null;
	  String in_s = newString ;
	  String in_sh = newString;
	  double unary; 
	  double expression;
	  double second_expression;
	  double num;
	  int i;
	  
	  i = 0;
	  factor = 1;
	  if (c.in.charAt(i) == '-') {
		unary = -1.0;
		in_s = c.in.substring( i+1 );
//		String new_in = new String (in_s);
		c.in = in_s;
		if ((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) {
			  
			   factor = eval_number ( c );
			   if (c.in.charAt(i) == '^') {
					  in_s = c.in.substring( i+1 );
					  c.in = in_s;
					  
					  if ((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) {
						  exponent = eval_number ( c );
						  factor = Math.pow ( factor, exponent );
						  factor = unary * factor;
						  return factor;
					  }
					  else if (c.in.charAt(i) == '(') {
						   in_s = c.in.substring( i+1 );
						   
						   c.in = in_s;
						   expression = eval_expr ( c );
						   if (c.in.charAt(i) != ')'){
							   error = 1;
						   }
						   in_s = c.in.substring( i+1 );
						   
						   c.in = in_s;
						   expression = unary * expression;
						   factor = Math.pow ( factor,  expression ); 
						   return factor;
					  }
			   }
			   factor = unary * factor;
			   return factor;
		}
		else
		if (c.in.charAt(i) == '(') {
			   in_sh = c.in.substring( i+1 );
				  
			   c.in = in_sh;
			   expression = eval_expr ( c );
			   if (c.in.charAt(i) != ')'){
				   error = 1;
			   }
			   in_s = c.in.substring( i+1 );
			   c.in = in_s;
			   
			   if (c.in.charAt(i) == '^') {
					  in_s = c.in.substring( i+1 );
					  c.in = in_s;
					  
					  if ((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) {
						  exponent = eval_number ( c );
						  factor = Math.pow ( expression, exponent );
						  factor = unary * factor;
						  return factor;
					  }
					  else if (c.in.charAt(i) == '(') {
						   in_s = c.in.substring( i+1 );
						   
						   c.in = in_s;
						   second_expression = eval_expr ( c );
						   if (c.in.charAt(i) != ')'){
							   error = 1;
						   }
						   in_s = c.in.substring( i+1 );
						   
						   c.in = in_s;
						   factor = Math.pow ( expression,  second_expression );
						   factor = unary * factor;
						   return factor;
					  }
					  else if (c.in.charAt(i) == '-') {
						  factor = eval_factor 	( c );
						  factor = Math.pow ( expression, factor );
						  factor = unary * factor;
						  return factor;
					  }
					  
			   }
			   		   
			   factor = unary * expression;
			   return factor;
		}
	  }
	  else {
	    unary = 1.0;
		in_s = c.in.substring( i );
//		String new_in = new String (in_s);ä
		c.in = in_s;
		if ((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) {
			  
			  num = eval_number ( c );
			  if (c.in.charAt(i) == '^') {
				  in_s = c.in.substring( i+1 );
				  c.in = in_s;
				
				  if ((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) {
					  exponent = eval_number ( c );
					  factor = Math.pow ( num, exponent );
					  factor = unary * factor;
					  return factor;
				  }
				  else if (c.in.charAt(i) == '(') {
					   in_s = c.in.substring( i+1 );
					   
					   c.in = in_s;
					   expression = eval_expr ( c );
					   if (c.in.charAt(i) != ')'){
						   error = 1;
					   }
					   in_s = c.in.substring( i+1 );
					   
					   c.in = in_s;
					   expression = unary * expression;
					   factor = Math.pow ( num,  expression );
					   return factor;
				  }
				  else if (c.in.charAt(i) == '-') {
					  factor = eval_factor 	( c );
					  factor = Math.pow ( num, factor );
					  factor = unary * factor;
					  return factor;
				  }
				  
		   
			 }	  
			 factor = unary * num;
			 return factor; 
		}
		else
		  if (c.in.charAt(i) == '(') {
			   in_sh = c.in.substring( i+1 );
				  
			   c.in = in_sh;
			   expression = eval_expr ( c );
			   if (c.in.charAt(i) != ')'){
				   error = 1;
			   }
			   in_s = c.in.substring( i+1 );
			   c.in = in_s;
			   
			   if (c.in.charAt(i) == '^') {
					  in_s = c.in.substring( i+1 );
					  c.in = in_s;
					
					  if ((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) {
						  exponent = eval_number ( c );
						  factor = Math.pow ( expression, exponent );
						  factor = unary * factor;
						  return factor;
					  }
					  else if (c.in.charAt(i) == '(') {
						   in_s = c.in.substring( i+1 );
						   
						   c.in = in_s;
						   second_expression = eval_expr ( c );
						   if (c.in.charAt(i) != ')'){
							   error = 1;
						   }
						   in_s = c.in.substring( i+1 );
						   
						   c.in = in_s;
						   
						   factor = Math.pow ( expression,  second_expression );
						   return factor;
					  }
					  else if (c.in.charAt(i) == '-') {
						  factor = eval_factor 	( c );
						  factor = Math.pow ( expression, factor );
						  return factor;
					  }
					  
				 }
			   
			   factor = unary * expression;
			   return factor;
		  }
		
	  }
//	  i = 0;
//	  if (c.in.charAt(i) == '(') {
//		   in_sh = c.in.substring( i+1 );
//		  
//		   c.in = in_sh;
//		   expression = eval_expr ( c );
//		   if (c.in.charAt(i) != ')'){
//			   error = 1;
//		   }
//		   in_s = c.in.substring( i+1 );
//		   c.in = in_s;
//		   factor = unary * expression;
//		   return factor;
//	  }
	 error = 1;
	 return factor;
}

public double eval_term ( StringC c ){
		  
	  double factor;
	  String newString = null;
	  String in_s = newString ;
	  int i;
	  factor = eval_factor ( c );
	  i = 0;
	  while (c.in.charAt(i) != '=')
	  {
		  if (c.in.charAt(i) == '*') {
			   in_s = c.in.substring( i+1 );
			   
			   c.in = in_s;
			   factor = factor * eval_factor ( c );
		  }
		  else if (c.in.charAt(i) == '/') {
			   in_s = c.in.substring( i+1 );
			 
			   c.in = in_s;
			   factor = factor / eval_factor ( c );
		  }
		  else  return factor;	 
	  }
	  return factor;
  }
  

	public double eval_na_ntu ( StringC c){
		
		  double factor;
		  String newString = null;
		  String in_s = newString ;
		  double expression;
		  double num;
		  double exponent;
		  int i;
		  i = 0;
		  num = 1;
		   if (c.in.charAt(i) == '^') {
				  in_s = c.in.substring( i+1 );
				  
				  c.in = in_s;
				  if ((c.in.charAt(i)>='0') && (c.in.charAt(i)<='9')) {
					  exponent = eval_number ( c );
					  num = Math.pow (num, exponent );
					  return num;
				  }
				  else if (c.in.charAt(i) == '(') {
					   in_s = c.in.substring( i+1 );
					   
					   c.in = in_s;
					   expression = eval_expr ( c );
					   if (c.in.charAt(i) != ')'){
						   error = 1;
					   }
					   num = Math.pow (num,  expression );
					   return num;
				  }
		   
		   } 
		return num;
		
	}

  public double eval_expr ( StringC c ){
	  
	  double term;
	  String newString = null;
	  String in_s = newString ;
	  int i;
	  
	  term = eval_term ( c );
	  i = 0;
	  while (c.in.charAt(i) != '=')
	  {
		  if (c.in.charAt(i) == '-') {
			   in_s = c.in.substring( i+1 );
	
			   c.in = in_s;
			   term = term - eval_term ( c );
		  }
		  else if (c.in.charAt(i) == '+') {
			   in_s = c.in.substring( i+1 );
			  
			   c.in = in_s;
			   term = term + eval_term ( c );
		  }
		  else  return term;	 
	  } 
	  return term;
  }
  
   
  public static double dd_output;
  
  public void sendMessage_get (View view){
	   	
	myTxtColor = 0xff101010; 
	int i,j;
	error = 0;
	AddToString ("=");
	String in_string = new String (stringToPut);
	
	j = in_string.length ();
	if (j != 0) {
  	  for ( i=0; in_string.charAt(i)!='='; i++);
  	  if ( (i>1) && (in_string.charAt(i) == '=')) {
		
		
		StringC cc = new StringC ();
		fillString (cc , in_string );
		dd_output = eval_expr ( cc );
		
		stringToPut = stringToPut + Double.toString(dd_output);
  	  }
  	  else stringToPut = "invalid input";
	};
		
	//in_string = stringToPut;
	
	Intent intent = new Intent (this, DisplayMessageActivity.class);
//	Intent intent = new Intent (this, DisplayMessageActivity.class);
	EditText editText = (EditText ) findViewById(R.id.edit_message);
	String message = editText.getText().toString();
	j = message.length ();
	if (j != 0) {
//  	  for ( i=0; message.charAt(i)!='='; i++);
  	  if ( (j>1) && (message.charAt(j-1) == '=')) {

  		StringC cc = new StringC ();
		fillString (cc , message );
		dd_output = eval_expr ( cc );
		stringToPut = message + Double.toString(dd_output);
//		stringToPut = Double.toString(dd_output);
  	  }
  	  else stringToPut = "invalid input";
	}
			
//	intent.putExtra(EXTRA_MESSAGE, message);
//	startActivity(intent);
	intent.putExtra(EXTRA_MESSAGE, MainActivity.stringToPut );
	startActivity(intent);
	stringToPut = "";
	
  } 
 
}

