function binary(oper) {
	if( op != "" ) {
		exec();
	}

	if( input == "user" ) {
		lastvalue = textToNum(getValue(), base);
	} else {
		lastvalue = currvalue;
	}

	op = oper;
	needclear = true;
}

function uniary( op ) {
	if( input == "user" ) {
		currvalue = textToNum( getValue(), base );
	}

	if( op == "factorial" ) {
		currvalue = fac( currvalue );
	} else if( op == "sqrt" ) {
		currvalue = Math.sqrt( currvalue );
	} else if( op == "pow2" ) {
		currvalue = currvalue * currvalue ;
	} else if( op == "reverse" ) {
		currvalue = 1 / currvalue;
	}

	input = "computer";
	needclear = true;
	setValue( currvalue );
}

function tri( op ) {

	if( input == "user" ) {
		currvalue = textToNum( getValue(), base );
	}

	if( op == "sin" ) {
		currvalue = Math.sin( currvalue );
	} else if( op == "cos" ) {
		currvalue = Math.cos( currvalue );
	} else if( op == "tan" ) {
		currvalue = Math.tan( currvalue );
	} else if( op == "asin" ) {
		currvalue = Math.asin( currvalue );
	} else if( op == "acos" ) {
		currvalue = Math.acos( currvalue );
	} else if( op == "atan" ) {
		currvalue = Math.atan( currvalue );
	}

	input = "computer";
	needclear = true;
	setValue( currvalue );
}

function pi() {
	input = "computer";
	needclear = true;
	currvalue = Math.PI;
	setValue( currvalue );
}

function e() {
	input = "computer";
	needclear = true;
	currvalue = Math.E;
	setValue( currvalue );
}

function exec() {

	if( input == "user" ) {
		currvalue = textToNum(getValue(), base);
	}

	if( op == "add" ) {
		currvalue = lastvalue + currvalue;
	} else if( op == "sub" ) {
		currvalue = lastvalue - currvalue;
	} else if( op == "mul" ) {
		currvalue = lastvalue * currvalue;
	} else if( op == "div" ) {
		currvalue = lastvalue / currvalue;
	} else if (op == "mod" ) {
		currvalue = lastvalue % currvalue;
	} else if (op == "pow" ) {
		currvalue = Math.pow( lastvalue, currvalue );
	} else {
	}

	op = "";
	input = "computer";
	needclear = true;
	setValue( currvalue );
}

function MR() {
	setValue( numToText( memory, base ) );
	needclear = true;
}

function MP() {
	if( input == "user" ) {
		currvalue = textToNum( getValue(), base );
	}

	memory += currvalue;
	needclear = true;
}

function MC() {
	memory = 0;
	needclear = true;
}

function Append( text ) {

	input = "user";
	if( text == "." ) {
		if( needclear ) {
			setValue( "0." );
			needclear = false;
			return;
		}

		if( getValue().indexOf( "." ) == -1 ) {
			setValue( getValue() + text );
		}
		return;
	}

	if( needclear || getValue() == "0" ) {
		setValue( text.toString() );
		needclear = false;
		return;
	}

	setValue( getValue() + text.toString() );
}

function changeSign() {
	if( input == "user" ) {
		currvalue = textToNum( getValue(), base );
	}

	currvalue = currvalue * -1;
	setValue( currvalue );
}

function setBase(newBase) {
	if( input == "user" ) {
		currvalue = textToNum( getValue(), base );
	}

	if ( base != newBase ) {
		base = newBase;
		setValue( numToText( currvalue, base) );
	}

	for (i = 0; i < 16; i++)
		document.calc.bNum[i].disabled = textToNum(document.calc.bNum[i].value, 16) >= base;
}

function ln( b ) {
	if( input == "user" ) {
		currvalue = textToNum( getValue(), base );
	}
	input = "computer";

	setValue (numToText( Math.log( currvalue ) / Math.log( b ), base ));
}

function getValue() {
	return document.calc.bar.value;
}

function setValue( v ) {
	document.calc.bar.value = v;
}

function resetValue() {
	currvalue = 0;
	setValue( currvalue );
	op = "";
}

function getkey( e )
{
	// alert( e.keyCode );
	// alert( e.which );

	// FIXME
	key = e.which;
	num = e.which - 48;

	if( base == 2 ) {
		if( num >= 0 && num <= 1 ) {
			Append( num );
			return;
		}
	} else if( base == 8 ) {
		if( num >= 0 && num <= 7 ) {
			Append( num );
			return;
		}
	} else if( base == 10 ) {
		if( num >= 0 && num <= 9 ) {
			Append( num );
			return;
		}
	} else if( base == 16 ) {
		if( num >= 0 && num <= 9 ) {
			Append( num );
		} else if ( key >= 97 && key <= 102) {
			switch( key ) {
				case 97:
					Append( 'A' );
					break;
				case 98:
					Append( 'B' );
					break;
				case 99:
					Append( 'C' );
					break;
				case 100:
					Append( 'D' );
					break;
				case 101:
					Append( 'E' );
					break;
				case 102:
					Append( 'F' );
					break;
			};
		}
	}

	switch( e.keyCode ) {
		case 27:
			resetValue();
			break;
	};

	switch( key ) {
		case 13:
			exec();
			break;
		case 42:
			binary('mul');
			break;
		case 43:
			binary('add');
			break;
		case 45:
			binary('sub');
			break;
		case 46:
			Append('.');
			break;
		case 47:
			binary('div');
			break;
	};
}

function init() {

	input = "user";
	op = "";
	lastvalue = 0;
	currvalue = 0;
	needclear = false;
	base = 10;
	memory = 0;

	document.calc.dig[2].checked = true;
	setBase(base);
	resetValue();
}

