﻿r = new Array(2);
var maxResultLength = 15;
var message = "Ошибка"

function setStartState() {
	 state="start";
	 r[0] = "0";
	 r[1] = "0";
	 operator="";
	 ix=0;
};

function addDigit(n) {
	if(state == "gettingInteger" || state == "gettingFloat")
		r[ix] = appendDigit(r[ix],n);
	else {
		r[ix] = "" + n;
		state = "gettingInteger";
	}
	display(r[ix]);
};

function appendDigit(n1,n2) {
	if (n1 == "0") return "" + n2;
	var s = "";
	s += n1;
	s += n2;
	return s;
};

function display(s) {
	if (s.length > maxResultLength)
		s = cutOffResult(s);

	$('#display').html(s);
};

function cutOffResult(result) {
	var main;
	var end;
	var tens;
	
	if (result.indexOf('e') < 0) {
		main = result.substring(0, 1) + '.' + result.substring(1, maxResultLength - 4);
		end = result.substring(maxResultLength - 4, result.length);
		
		tens = end.length + "";
		
		result = main + 'e+' + tens;
		
		if (result.length > maxResultLength)
			result = cutOffResult(result);
			
	} else {
		var i = result.indexOf('e');
		
		main = result.substring(0, i);
		end = result.substring(i, result.length);
		
		tens = end.substring(2, end.length);
		tens = parseInt(tens);
		
		tens += result.length - maxResultLength;
		main = main.substring(0, main.length - (result.length - maxResultLength));
		
		result = main + 'e+' + tens;
		if (result.length > maxResultLength)
			result = cutOffResult(result);
	};
	
	return result;
};

function addDecimalPoint() {
	if(state != "gettingFloat") {
		decimal = true;
		r[ix] += ".";
		if(state == "haveOperand" || state == "getOperand2") r[ix] = "0.";
		state = "gettingFloat";
		display(r[ix]);
	};
};

function clearDisplay() {
	setStartState();
	display(r[0]);
};

function changeSign() {
	if(r[ix].charAt(0) == "-") r[ix] = r[ix].substring(1,r[ix].length);
	else if(parseFloat(r[ix]) !=0 ) r[ix] = "-" + r[ix];
	display(r[ix]);
};

function calc() {
	if(state == "gettingInteger" || state == "gettingFloat" || state == "haveOperand") {
		if(ix==1) {
			r[0] = calculateOperation(operator, r[0], r[1]);
			ix = 0;
		}
	} else if (state == "getOperand2") {
		r[0] = calculateOperation(operator, r[0], r[0]);
		ix = 0;
	};
	
	state = "haveOperand";
	decimal = false;
	display(r[ix]);
	if (r[0] == message)
		r[0] = 0;
};

function calculateOperation(op,x,y) {
	var result = "";
	if (op == "+") {
		result = "" + (parseFloat(x) + parseFloat(y));
	} else if (op == "-") {
		result = "" + (parseFloat(x) - parseFloat(y));
	} else if (op == "*") {
		result = "" + (parseFloat(x) * parseFloat(y));
	} else if ( op == "/") {
		if (parseFloat(y) == 0){
			result = 0;
			return message
		} else result = ""+(parseFloat(x)/parseFloat(y));
	};
	return result;
};

function performPercent() {
	r[1] = (r[0] * r[1])/100;
};

function performOp(op) {
	if (state == "start") {
		++ix;
		operator = op;
	} else if (state == "gettingInteger" || state == "gettingFloat" || state == "haveOperand") {
		if (ix == 0) {
			++ix;
			operator = op;
		} else {
			r[0] = calculateOperation(operator, r[0], r[1]);
			display(r[0]);
			if (r[0] == message)
				r[0] = 0;
			operator = op;
		};
	};
	
	state = "getOperand2";
	decimal = false;
};

