#!/usr/local/bin/perl
# input:  set value of $Formula, e.g. $Formula="H2O";
# output: $Element array defined, one array element for each elment, in order

sub ErrMsg {
 ($ErrorMessage)=@_;
# if ($ErrorMessage == 16 ) {print "Invalid Element Name in Formula\n"}
# else {print "Error<br>"; }
# exit;
}

sub numerically { $a <=> $b; }

  
sub ParseFormulaH {  # Parse Formula for use of header files
 local($Formula)=@_;
 local ($hdr_list);
 $ECount=0;
 while ( $Formula =~ /^([A-Z][a-z]?[0-9]*)/ ) {
  $Formula=substr($Formula, length($1));
  $h=$1;
  $h =~ s/[0-9]//g; 
  if (($HeaderElement[$ECount++]=&Sym2Num($h)) == -1) 
      { print "Error"; &ErrMsg(16); }   # FIX
 }
 if (($Formula ne "") || ($ECount <= 0))
   { &ErrMsg(16); }  #FIX
   
  $hdr_list=join(",",@HeaderElement);
  return $hdr_list;   
}

sub ParseFormula {
 local($Formula)=@_;
 local(%Weight);
 if ( $Formula eq "")
 { &ErrMsg(1); }
 $SymCnt=1;
 $ECount=0; $MassTotal=0;
 while ( $Formula =~ /^([A-Z][a-z]?[0-9]*)/ )
 {
  $Element[$ECount]=$1;
  $Formula=substr($Formula, length($1));
  $HeaderElement[$ECount]=$1;
  $HeaderElement[$ECount] =~ s/[0-9]//g;
  $ECount++;
 }
 if ($Formula ne "")
 { if ($Method == 2) { &ErrMsg(10); }
   else { &ErrMsg(16); }
 }  
   

 if ( $ECount <= 0 )
 { if ($Method == 2) { &ErrMsg(10); }
   else { &ErrMsg(16); }
 }

 for ($count=0;$count < $ECount; $count++)
 {
  if ($Element[$count] =~ /^([A-Za-z]+)/)
  {
   $ZSym=$1;
   $ZNum=&Sym2Num($ZSym);
   if ($ZNum < 1)
   { if ($Method == 2) { &ErrMsg(10); }
     else { &ErrMsg(16); }
   }
  }
  else
  { if ($Method == 2) { &ErrMsg(10); }
   else { &ErrMsg(16); }
  }

  if ($Element[$count] =~ /(\d+)$/)
  { $Num=$1; }
  else
  { $Num=1; }
  $W=$Num * $AtomW[$ZNum];
  $MassTotal += $W;
  $Weight{$ZNum} += $W;
 }

 @Els= sort (keys(%Weight));

 for ($count=0; $count <= $#Els; $count++)
 {
  $R=sprintf( "%.6f", ($Weight{$Els[$count]}/$MassTotal) );
  $Weight{$Els[$count]}=$R;
 }
 return %Weight; 
}


sub Sym2Num {
 ($ele)=@_;
 $ele =~ tr/A-Z/a-z/; $num=-1;
 if( $ele eq 'h'  ) { $num =    1; }
 if( $ele eq 'he' ) { $num =    2; }
 if( $ele eq 'li' ) { $num =    3; }
 if( $ele eq 'be' ) { $num =    4; }
 if( $ele eq 'b'  ) { $num =    5; }
 if( $ele eq 'c'  ) { $num =    6; }
 if( $ele eq 'n'  ) { $num =    7; }
 if( $ele eq 'o'  ) { $num =    8; }
 if( $ele eq 'f'  ) { $num =    9; }
 if( $ele eq 'ne' ) { $num =   10; }
 if( $ele eq 'na' ) { $num =   11; }
 if( $ele eq 'mg' ) { $num =   12; }
 if( $ele eq 'al' ) { $num =   13; }
 if( $ele eq 'si' ) { $num =   14; }
 if( $ele eq 'p'  ) { $num =   15; }
 if( $ele eq 's'  ) { $num =   16; }
 if( $ele eq 'cl' ) { $num =   17; }
 if( $ele eq 'ar' ) { $num =   18; }
 if( $ele eq 'k ' ) { $num =   19; }
 if( $ele eq 'ca' ) { $num =   20; }
 if( $ele eq 'sc' ) { $num =   21; }
 if( $ele eq 'ti' ) { $num =   22; }
 if( $ele eq 'v' ) { $num =   23; }
 if( $ele eq 'cr' ) { $num =   24; }
 if( $ele eq 'mn' ) { $num =   25; }
 if( $ele eq 'fe' ) { $num =   26; }
 if( $ele eq 'co' ) { $num =   27; }
 if( $ele eq 'ni' ) { $num =   28; }
 if( $ele eq 'cu' ) { $num =   29; }
 if( $ele eq 'zn' ) { $num =   30; }
 if( $ele eq 'ga' ) { $num =   31; }
 if( $ele eq 'ge' ) { $num =   32; }
 if( $ele eq 'as' ) { $num =   33; }
 if( $ele eq 'se' ) { $num =   34; }
 if( $ele eq 'br' ) { $num =   35; }
 if( $ele eq 'kr' ) { $num =   36; }
 if( $ele eq 'rb' ) { $num =   37; }
 if( $ele eq 'sr' ) { $num =   38; }
 if( $ele eq 'y'  ) { $num =   39; }
 if( $ele eq 'zr' ) { $num =   40; }
 if( $ele eq 'nb' ) { $num =   41; }
 if( $ele eq 'mo' ) { $num =   42; }
 if( $ele eq 'tc' ) { $num =   43; }
 if( $ele eq 'ru' ) { $num =   44; }
 if( $ele eq 'rh' ) { $num =   45; }
 if( $ele eq 'pd' ) { $num =   46; }
 if( $ele eq 'ag' ) { $num =   47; }
 if( $ele eq 'cd' ) { $num =   48; }
 if( $ele eq 'in' ) { $num =   49; }
 if( $ele eq 'sn' ) { $num =   50; }
 if( $ele eq 'sb' ) { $num =   51; }
 if( $ele eq 'te' ) { $num =   52; }
 if( $ele eq 'i' ) { $num =   53; }
 if( $ele eq 'xe' ) { $num =   54; }
 if( $ele eq 'cs' ) { $num =   55; }
 if( $ele eq 'ba' ) { $num =   56; }
 if( $ele eq 'la' ) { $num =   57; }
 if( $ele eq 'ce' ) { $num =   58; }
 if( $ele eq 'pr' ) { $num =   59; }
 if( $ele eq 'nd' ) { $num =   60; }
 if( $ele eq 'pm' ) { $num =   61; }
 if( $ele eq 'sm' ) { $num =   62; }
 if( $ele eq 'eu' ) { $num =   63; }
 if( $ele eq 'gd' ) { $num =   64; }
 if( $ele eq 'tb' ) { $num =   65; }
 if( $ele eq 'dy' ) { $num =   66; }
 if( $ele eq 'ho' ) { $num =   67; }
 if( $ele eq 'er' ) { $num =   68; }
 if( $ele eq 'tm' ) { $num =   69; }
 if( $ele eq 'yb' ) { $num =   70; }
 if( $ele eq 'lu' ) { $num =   71; }
 if( $ele eq 'hf' ) { $num =   72; }
 if( $ele eq 'ta' ) { $num =   73; }
 if( $ele eq 'w' ) { $num =   74; }
 if( $ele eq 're' ) { $num =   75; }
 if( $ele eq 'os' ) { $num =   76; }
 if( $ele eq 'ir' ) { $num =   77; }
 if( $ele eq 'pt' ) { $num =   78; }
 if( $ele eq 'au' ) { $num =   79; }
 if( $ele eq 'hg' ) { $num =   80; }
 if( $ele eq 'tl' ) { $num =   81; }
 if( $ele eq 'pb' ) { $num =   82; }
 if( $ele eq 'bi' ) { $num =   83; }
 if( $ele eq 'po' ) { $num =   84; }
 if( $ele eq 'at' ) { $num =   85; }
 if( $ele eq 'rn' ) { $num =   86; }
 if( $ele eq 'fr' ) { $num =   87; }
 if( $ele eq 'ra' ) { $num =   88; }
 if( $ele eq 'ac' ) { $num =   89; }
 if( $ele eq 'th' ) { $num =   90; }
 if( $ele eq 'pa' ) { $num =   91; }
 if( $ele eq 'u' ) { $num =   92; }
 if( $ele eq 'np' ) { $num =   93; }
 if( $ele eq 'pu' ) { $num =   94; }
 if( $ele eq 'am' ) { $num =   95; }
 if( $ele eq 'cm' ) { $num =   96; }
 if( $ele eq 'bk' ) { $num =   97; }
 if( $ele eq 'cf' ) { $num =   98; }
 if( $ele eq 'es' ) { $num =   99; }
 if( $ele eq 'fm' ) { $num =  100; }
# if( $ele eq 'md' ) { $num =  101; }
# if( $ele eq 'no' ) { $num =  102; }
# if( $ele eq 'lr' ) { $num =  103; }
 return $num;
}

1;
