
// Copyright 2009 - 2010. Dr. Christer Svensson

function formulamass(formula){
  
   var asterisk = false;
   var digits = "";
   var element ="";
   var calctext = "";
   var i = 0;

   formula = formula.replace(/ /g,"");

   while (i<formula.length){

      if(formula.substring(i,i+1) == "[" || formula.substring(i,i+1) == "{" || formula.substring(i,i+1) == "("){
         calctext = calctext+"(";
         i++;
      }

      if(formula.substring(i,i+1) == "]" || formula.substring(i,i+1) == "}" || formula.substring(i,i+1) == ")"){    
         calctext = calctext+")";
         i++;
         if (formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
            while(formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
               digits = digits + formula.substring(i,i+1);
               i++;
            }
            calctext = calctext + "*" + digits;            
         }
         if (i < formula.length && formula.substring(i,i+1) != ")"){
            calctext = calctext + "+";
         } 
         digits = "";
      }

      if(formula.substring(i,i+1) >= "A" && formula.substring(i,i+1) <= "Z"){
         element = formula.substring(i,i+1);
         i++;  
         if(formula.substring(i,i+1) >= "a" && formula.substring(i,i+1) <= "z"){
            while(formula.substring(i,i+1) >= "a" && formula.substring(i,i+1) <= "z"){
               element = element + formula.substring(i,i+1);
               i++;           
            }         
         }
         calctext = calctext + parseFloat(atommass(element));
   
         if(calctext.substring(calctext.length - 3,calctext.length)=="NaN"){
            return "NaN";
         }
         if (formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
            while(formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
               digits = digits + formula.substring(i,i+1);
               i++;
            }
            calctext = calctext + "*" + digits;            
         }
         if (i < formula.length  && formula.substring(i,i+1) != ")"){
            calctext = calctext + "+";
         }
         element = ""; 
         digits = "";
      }

      if(formula.substring(i,i+1) == "*"){
         i++;
         asterisk = true;
	 while(formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
	    digits = digits + formula.substring(i,i+1);
            i++;
         }
         if (digits != ""){
            calctext = calctext + digits + "*(";
         }
         else{
            calctext = calctext + "(";
         }
         digits = "";
      }

      if (i == formula.length && asterisk){
         calctext = calctext + ")";
      }
      if(formula.substring(i,i+1) >= "a" && formula.substring(i,i+1) <= "z"){
         return "NaN";
      }

   }   
   return calctext;
}

function atommasserror(element) {
   var atommassvalue = atommass(element);
   var i = 0;
   var atommassvalueerror = "";
   var j = 0;
   while (i < atommassvalue.length){
      if(atommassvalue.substring(i,i+1) == "("){
         atommassvalueerror = atommassvalueerror.substring(j-1,i-1) + atommassvalue.substring(i+1,i+2);
         decimals = Math.max(decimals,i - j - 1);
         return atommassvalueerror;
      }
      if(atommassvalue.substring(i,i+1) == "."){
         atommassvalueerror = atommassvalueerror + ".";
         j = i;
      }
      else {
         atommassvalueerror = atommassvalueerror + "0";
      }
      i++;
   }
}

function formulamasserror(formula){
  
   var asterisk = false;
   var digits = "";
   var element ="";
   var calcerrortext = "";
   var i = 0;

   formula = formula.replace(/ /g,"");

   while (i<formula.length){

      if(formula.substring(i,i+1) == "[" || formula.substring(i,i+1) == "{" || formula.substring(i,i+1) == "("){
         calcerrortext = calcerrortext + "(";
         i++;
      }

      if(formula.substring(i,i+1) == "]" || formula.substring(i,i+1) == "}" || formula.substring(i,i+1) == ")"){    
         calcerrortext = calcerrortext + ")";
         i++;
         if (formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
            while(formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
               digits = digits + formula.substring(i,i+1);
               i++;
            }
            calcerrortext = calcerrortext + "*" + digits;            
         }
         if (i < formula.length && formula.substring(i,i+1) != ")"){
            calcerrortext = calcerrortext + "+";
         } 
         digits = "";
      }

      if(formula.substring(i,i+1) >= "A" && formula.substring(i,i+1) <= "Z"){
         element = formula.substring(i,i+1);
         i++;  
         if(formula.substring(i,i+1) >= "a" && formula.substring(i,i+1) <= "z"){
            while(formula.substring(i,i+1) >= "a" && formula.substring(i,i+1) <= "z"){
               element = element + formula.substring(i,i+1);
               i++;           
            }         
         }
   
         //calcerrortext = calcerrortext + parseFloat(atommasserror(element));
         calcerrortext = calcerrortext + atommasserror(element);

         if(calcerrortext.substring(calcerrortext.length - 3,calcerrortext.length)=="NaN"){
            return "NaN";
         }
         if (formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
            while(formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
               digits = digits + formula.substring(i,i+1);
               i++;
            }
            calcerrortext = calcerrortext + "*" + digits;            
         }
         if (i < formula.length  && formula.substring(i,i+1) != ")"){
            calcerrortext = calcerrortext + "+";
         }
         element = ""; 
         digits = "";
      }

      if(formula.substring(i,i+1) == "*"){
         i++;
         asterisk = true;
	 while(formula.substring(i,i+1) >= "0" && formula.substring(i,i+1) <= "9"){
	    digits = digits + formula.substring(i,i+1);
            i++;
         }
         if (digits != ""){
            calcerrortext = calcerrortext + digits + "*(";
         }
         else{
            calcerrortext = calcerrortext + "(";
         }
         digits = "";
      }

      if (i == formula.length && asterisk){
         calcerrortext = calcerrortext + ")";
      }
      if(formula.substring(i,i+1) >= "a" && formula.substring(i,i+1) <= "z"){
         return "NaN";
      }

   }   
   return calcerrortext;
}

function format_molar_mass(mass_to_calc,masserror_to_calc) {
   var the_uncertainty = eval(masserror_to_calc);
   var the_molarmass = eval(mass_to_calc);
   var i = 0;

   while(the_uncertainty < 1) {
     the_uncertainty = the_uncertainty * 10;
     i++;
   }

   if (masserror_to_calc.indexOf("+") == -1 && masserror_to_calc.indexOf("*") == -1) {
      the_uncertainty = Math.round(the_uncertainty);
      one = "True";
   }
   else {
      the_uncertainty = Math.round(the_uncertainty + 0.5);
   }
   the_uncertainty = the_uncertainty / Math.pow(10,i);

   the_molarmass = the_molarmass.toFixed(i);
   the_uncertainty = the_uncertainty.toFixed(i);

   return "(" + the_molarmass.toString() + " ± " + the_uncertainty.toString() + ")";
}

