		function factorial(n){
			if(n == 0 )
				return 1;
			else
				return n*factorial(n-1);
		}

		function executeOperation(operation) { 
		try{
			//alert(currentOperation);
		//	alert(operation);
			if(operation == '') { 
				alert("Nessun operatore"); 
			} 
			if(operation == 'clear') { 
				//clear the Input field
				clearInput = true; 
				previousNumber = 0; 
				document.calculator.textCalculator.value = '0'; 
				currentOperation = ''; 
				return; 
			}
			if(operation == 'clearentry') { 
				//clear the Input field
				document.calculator.textCalculator.value = '0'; 
				return; 
			} 
			if(operation == 'invert') { 
				var calculatorValue = document.calculator.textCalculator; 
				if(calculatorValue.value.charAt(0) == '-') { 
					calculatorValue.value = calculatorValue.value.substr(1, calculatorValue.value.length); 
				} 
				else { 
					if(calculatorValue.value != '0') 
						calculatorValue.value = '-' + calculatorValue.value;
				} 
				return; 
			} 
			if(operation == 'memoryin'){
				memory = parseFloat(eval(document.calculator.textCalculator.value));
		//		clearInput = true;
				return;
			}
			if(operation == 'memoryget'){
				previousNumber = eval(parseFloat(document.calculator.textCalculator.value));
				document.calculator.textCalculator.value = memory;
				return;
			}
			
			if(currentOperation == '') { // No pending operation 
			
				if(operation == 'equals'){  
					clearInput = true; 
					document.calculator.textCalculator.value = eval(document.calculator.textCalculator.value);
				}
				else { 
					var calculatorValue = parseFloat(eval(document.calculator.textCalculator.value));
			
					if(operation == 'sqrt'){
						if(calculatorValue < 0){
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						previousNumber = Math.sqrt(calculatorValue);
						document.calculator.textCalculator.value = previousNumber; 
					}
					else if(operation == 'ln'){
						if(calculatorValue == 0){
							previousNumber = 0;
							clearInput = true;
							document.calculator.textCalculator.value = "Input error"; 
							return;
						}
						clearInput = true;
						previousNumber = Math.log(calculatorValue);
						document.calculator.textCalculator.value = previousNumber; 
					}
					else if(operation == 'exp'){
						clearInput = true;
						previousNumber = Math.exp(calculatorValue);
						document.calculator.textCalculator.value = previousNumber; 
					}
					else if(operation == 'euro'){
						clearInput = true;
						previousNumber = Math.round(100*calculatorValue/1936.27)/100; 
						document.calculator.textCalculator.value = previousNumber; 
					}
					else if(operation == 'lire'){
						clearInput = true;
						previousNumber = Math.round(calculatorValue*1936.27); 
						document.calculator.textCalculator.value = previousNumber; 
					}
					else if(operation == '1/x'){
						if(calculatorValue == 0){
							previousNumber = 0;
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						previousNumber = 1/parseFloat(calculatorValue);
						document.calculator.textCalculator.value = previousNumber; 
					}
					else if(operation == 'log'){
						if(calculatorValue == 0){
							previousNumber = 0;
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						previousNumber = Math.log(calculatorValue) / Math.LN10;
						document.calculator.textCalculator.value = previousNumber; 
					}
					else if(operation == 'fact'){
						if(calculatorValue < 0){
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						previousNumber = factorial(parseInt(calculatorValue));
						document.calculator.textCalculator.value = previousNumber; 
					}
					else{
						currentOperation = operation; 
						clearInput = true; 
						previousNumber = eval(document.calculator.textCalculator.value); 
						//document.calculator.textCalculator.value = '';
						document.calculator.textCalculator.focus();			
					}
				} 
			} 
			else { // We need to do an operation first. 
				if(operation == 'sqrt' ||  operation == 'ln' || operation == '1/x' || operation == 'log'
					|| operation == 'fact'){
					var calculatorValue = parseFloat(eval(document.calculator.textCalculator.value));
			
					if(operation == 'sqrt'){
						if(calculatorValue < 0){
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						document.calculator.textCalculator.value = Math.sqrt(calculatorValue);; 
					}
					else if(operation == 'ln'){
						if(calculatorValue == 0){
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						document.calculator.textCalculator.value = Math.log(calculatorValue); 
					}
					else if(operation == 'exp'){
						clearInput = true;
						document.calculator.textCalculator.value = Math.exp(calculatorValue);
					}
					else if(operation == '1/x'){
						if(calculatorValue == 0){
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						document.calculator.textCalculator.value = 1/parseFloat(calculatorValue);
					}
					else if(operation == 'log'){
						if(calculatorValue == 0){
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						document.calculator.textCalculator.value = Math.log(calculatorValue) / Math.LN10; 
					}
					else if(operation == 'fact'){
						if(calculatorValue < 0){
							clearInput = true;
							currentOperation = '';
							alert("Errore");
							document.calculator.textCalculator.value = "0"; 
							return;
						}
						clearInput = true;
						document.calculator.textCalculator.value = factorial(parseInt(calculatorValue));
					}
					else if(operation == 'euro'){
						clearInput = true;
						document.calculator.textCalculator.value = Math.round(100*calculatorValue/1936.27)/100;				
					}
					else if(operation == 'lire'){
						clearInput = true;
						document.calculator.textCalculator.value = Math.round(calculatorValue*1936.27);				
					};
					/*
					else{
						currentOperation = operation; 
						clearInput = true; 
						previousNumber = eval(document.calculator.textCalculator.value); 
						//document.calculator.textCalculator.value = '';
						document.calculator.textCalculator.focus();			
					}*/
					return;
				}
				var result = doEquals(); //make the operation
				if(result != "error"){
					previousNumber = eval(document.calculator.textCalculator.value); 
					if(operation == 'procent'){
						result = result / 100;
					}
					document.calculator.textCalculator.value = result; 
					if(operation != 'equals' && operation != 'procent')
						currentOperation = operation; 
					else 
						currentOperation = ''; // No pending operation 
				}
				else{
					document.calculator.textCalculator.value = result; 
					currentOperation = '';
					clearInput = true;
					previousNumber = 0;
				}
					
			} 
		}
		catch(e){
			alert("Errore");
			clearInput = true;
			//currentOperation = '';
			document.calculator.textCalculator.value = "0"; 
		}
		} 


		function doEquals() { 
			clearInput = true; 
			if (currentOperation == 'clear') { 
				alert("operation = clear"); 
				return 0; 
			} 
			if(currentOperation == 'equals') { 
				alert("operation = equals"); 
				return 0; 
			} 
			if(currentOperation == '') { 
				previousNumber = '0'; 
				return eval(document.calculator.textCalculator.value); 
			} 
			//do various operations
			
			if (currentOperation == 'plus') { 
				currentOperation = ''; 
				return parseFloat(previousNumber) + parseFloat(eval(document.calculator.textCalculator.value)); 
			} 
			if (currentOperation == 'minus') { 
				currentOperation = ''; 
				return parseFloat(previousNumber) - parseFloat(eval(document.calculator.textCalculator.value)); 
			} 
			if (currentOperation == 'multiply') { 
				currentOperation = ''; 
				return parseFloat(previousNumber) * parseFloat(eval(document.calculator.textCalculator.value)); 
			} 
			if (currentOperation == 'divide') { 
				currentOperation = ''; 
				return parseFloat(previousNumber) / parseFloat(eval(document.calculator.textCalculator.value)); 
			} 
			if (currentOperation == 'pow') { 
				currentOperation = ''; 
				return Math.pow(parseFloat(previousNumber),parseFloat(eval(document.calculator.textCalculator.value))); 
			}
			//if you are here do you have a error
			alert("Operatore sconosciuto"); 
			return "error"; 
		} 

		function enterNumber(number) { 
		try{
			if(clearInput) { 
				previousNumber = eval(document.calculator.textCalculator.value); 
				document.calculator.textCalculator.value = number; 
				clearInput = false; 
			} 
			else { 
				if(document.calculator.textCalculator.value == '0')
					document.calculator.textCalculator.value = number; 
				else
					document.calculator.textCalculator.value = document.calculator.textCalculator.value + number; 
			}
		} 
		catch(e){
			alert("Errore");
			clearInput = true;
			//currentOperation = '';
			document.calculator.textCalculator.value = "0"; 
		}
		} 

		function isValidChar(ascii){
			var i;
			var cod;
			if(event.shiftKey)
				cod = ascii * 10;
			else
				cod = ascii;
			for(i=0;i<validCodes.length;i++)
				if(cod == validCodes[i]){
		//			aaa.innerText += "valid";
					return true;
				}
			return false;
		}

		function codeToChar(code){
			var realCode;
			if(event.shiftKey)
				realCode = code * 10;
			else
				realCode = code;
			for(i=0;i<validCodes.length;i++)
				if(realCode == validCodes[i])
					return validChars[i];
		}

		function key(){
			aaa.innerText += event.keyCode;
			if(event.shiftKey)
				aaa.innerText += "shift";
		//	alert(event.keyCode);
		}

		function kdown(e){
			var c;
			var asciicode;
			var calculatorValue = document.calculator.textCalculator;
			if(bIE == 1)
				asciicode = event.keyCode;
			else
				asciicode = e.which;
		//	alert(asciicode);
		//	aaa.innerText += event.keyCode;
		//	aaa.innerText += asciicode;
			if((asciicode <= 31 || asciicode == 46 || asciicode == 37 || asciicode == 38 || asciicode == 39 || asciicode == 40)&& !event.shiftKey ){
				if(asciicode == 13)
					executeOperation('equals');
				return true;
			}
		//	alert(c);
			if(bIE == 1)
				document.calculator.textCalculator.focus();
		//	alert(isValidChar(asciicode));
			if(!isValidChar(asciicode)){
				calculatorValue.value = calculatorValue.value.substr(0, calculatorValue.value.length); 
				return false;
			}
			else{
				calculatorValue.value += codeToChar(asciicode);
				return false;
			}
			document.calculator.textCalculator.focus();
			return true;
		}


