
var token = '';var prog = '';var progIndex = 0;var oForm;var places = 2;var prepend = 0;var DELIMITER = 1;var VARIABLE = 2;var NUMBER = 3;var TOKEN_SIZE = 32;var TRUE = -1;var FALSE = 0;function Expression2(theForm,theExpression,Places,Prepend) {places = Places;prepend = Prepend;progIndex = 0;prog = theExpression;oForm = theForm;get_token();if(!token) {serror(2);}Level1();}function Level1(){var slot;var ttok_type;var temp_token;var result = 0.0;if(tok_type == VARIABLE) {temp_token = token;ttok_type = tok_type;if(typeof oForm[token] != "undefined" ) {slot = oForm[token];}else{serror(3);}get_token();if(token != '=') {putback();token = temp_token;tok_type = ttok_type;}else{get_token();result = Level2();slot.value = round(result,places);return;}}result=Level2();return result;}function Level2(){var op = '';var hold = 0;var result = 0;result=Level3();while((op = token) == '+' || op == '-') {get_token();hold=Level3();result = arith(op,result, hold);}return result;}function Level3(){var op = '';var hold = 0;var result = 0.0;	result = Level4();	while((op = token) == '*' || op == '/') {get_token();hold = Level4();result = arith(op,result, hold);}return result;}function Level4(){var hold = 0;var result = 0;result = Level5();if((token) == '^') {get_token();hold = Level4();result = arith('^',result, hold);}return result;}function Level5(){var op = '';var result = 0.0;op = 0;if((tok_type==DELIMITER) && token == '+' || token == '-') {op = token;get_token();}result = Level6();if(op)result = unary(op,result);return result;}function Level6(){var result = 0.0;if((token == '(') && (tok_type == DELIMITER)) {get_token();result = Level1();if(token != ')') { serror(1);} get_token(); } else { result = primitive(); }return result;}function primitive(){var slot = 0;var result = 0.0;var sValue = '';var i = 0;switch(tok_type) {case VARIABLE : if(typeof oForm[token] == "undefined") {	result = 0.0; } else {switch (oForm[token].tagName) {case 'INPUT' : sValue = '0.0';if (oForm[token].type != 'checkbox' )sValue = oForm[token].value; else if (oForm[token].checked) sValue = oForm[token].value; while(sValue.charAt(i) == ' ') ++i; if(sValue.charAt(i) == '') { ++i;}sValue = sValue.substr(i,sValue.length-i);if (!isNumber(sValue)) {serror(4);}result = parseFloat(sValue); if (isNaN(result)) result = 0; break;case 'SELECT' : sValue = oForm[token].options[oForm[token].selectedIndex].value; while(sValue.charAt(i) == ' ') ++i; if(sValue.charAt(i) == '') ++i;sValue = sValue.substr(i,sValue.length-i);	if (!isNumber(sValue)) serror(0);result = parseFloat(sValue);if (isNaN(result)) result = 0; break;default:if( oForm[token].length > 0 ) {for(i=0; i < oForm[token].length; i++) {if(oForm[token][i].checked) {sValue = oForm[token][i].value;while(sValue.charAt(i) == ' ') ++i;if(sValue.charAt(i) == '') ++i; sValue = sValue.substr(i,sValue.length-i);if (!isNumber(sValue)) serror(4);isNaN(parseFloat(sValue)) ? result += 0 : result += parseFloat(sValue);	var sType = oForm[token][i].type.toLowerCase();	sType = sType.toLowerCase();if (sType == 'radio') break;}}}break;}}get_token();return result;case NUMBER:result = parseFloat(token);get_token();return result;default:return result;}}
function arith(o,r,h){var t = 0.0;var ex = 0.0;	switch(o) {	case '-':r = r - h;	break;case '+':	r = r + h;	break;case '*':	r = r * h;break;case '/':r = r / h;break;case '%':t = ((r) / (h));r = r - (t*(h));break;case '^':ex =  r;if(h==0) {	r = 1.0;break;}for(t=h-1; t>0; --t) r = (r) * ex; break;}return r;}function unary(o, r){if(o=='-') r = -(r);return r;}function putback(){var t = '';t = token;for(;t;t++) progIndex--;}function find_var(s){var temp = '';temp = oForm.s.value;if( temp == '' ) {return(0.0);}return parseFloat(temp);}function serror(error){var e = new Array;e[0] =	"Syntax error";e[1] = 	"Unbalanced parentheses";e[2] = 	"no expression present";e[3] =  "Form field does not exist " + token;e[4] =  "Not a number";alert(e[error] + ' - ' + token);}function get_token(){var temp = '';tok_type =  0;while(prog.charAt(progIndex) == ' ') ++progIndex;if(is_in(prog.charAt(progIndex), "+-*/%^=()")) {tok_type = DELIMITER;temp += prog.charAt(progIndex++);} else if(isAlpha(prog.charAt(progIndex)) || prog.charAt(progIndex) == '') { while(!isdelim(prog.charAt(progIndex))) temp += prog.charAt(progIndex++);tok_type = VARIABLE;} else if (isDigit(prog.charAt(progIndex)) || prog.charAt(progIndex) == '.') {while(!isdelim(prog.charAt(progIndex)))temp += prog.charAt(progIndex++);tok_type = NUMBER;}token = temp;}function isdelim(c){if(is_in(c, "+-/*%^=() ") || c=='\t' || c=='\r')return 1; return 0;}function isAlpha(c) {var sAlpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';if (is_in(c,sAlpha)) return 1; else return 0;}function isDigit(c) {var Digits = '0123456789';	if (is_in(c,Digits))  return 1; else return 0; }function isNumber(s) {var dec = 0;var i = 0;if(s.charAt(i) == '-' || s.charAt(i) == '+') ++i;for(i; i<s.length; i++) {	if(!isDigit(s.charAt(i))) {if (s.charAt(i) != '.' || dec ) return 0; else ++dec; }}return 1;}function is_in(ch,s){if(s.indexOf(ch) > -1)  return 1; else return 0;}function round(number,places) {number = Math.round(number*Math.pow(10,places))/Math.pow(10,places);number += '';var x = number.lastIndexOf('.');	if (x == -1 && places > 0) { number += '.'; x = number.length -1; }for ( i = ((number.length-1) - x); i < places; i++) number += '0'; return prepend ? '' + number : number;}


