/* $Revision$ $Author$ $Date$
 * 
 * Copyright (C) 2006-2007  Egon Willighagen <egonw@users.sf.net>
 * 
 * Contact: cdk-devel@lists.sourceforge.net
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 * All we ask is that proper credit is given for our work, which includes
 * - but is not limited to - adding the above copyright notice to the beginning
 * of your source code files, and to any copyright notice that you may distribute
 * with programs based on this work.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 */
package org.openscience.cdk.config;

import java.util.HashMap;
import java.util.Map;


/**
 * List of element symbols. Data is taken from the Blue Obelisk Data Repository,
 * version 3.
 * 
 * @author     egonw
 * @cdk.module standard 
 * @cdk.githash
 */
public class Symbols {

	public final static String[] byAtomicNumber = {
		"Xx", // 0
		"H", // 1
		"He", // 2
		"Li", // 3
		"Be", // 4
		"B", // 5
		"C", // 6
		"N", // 7
		"O", // 8
		"F", // 9
		"Ne", // 10
		"Na", // 11
		"Mg", // 12
		"Al", // 13
		"Si", // 14
		"P", // 15
		"S", // 16
		"Cl", // 17
		"Ar", // 18
		"K", // 19
		"Ca", // 20
		"Sc", // 21
		"Ti", // 22
		"V", // 23
		"Cr", // 24
		"Mn", // 25
		"Fe", // 26
		"Co", // 27
		"Ni", // 28
		"Cu", // 29
		"Zn", // 30
		"Ga", // 31
		"Ge", // 32
		"As", // 33
		"Se", // 34
		"Br", // 35
		"Kr", // 36
		"Rb", // 37
		"Sr", // 38
		"Y", // 39
		"Zr", // 40
		"Nb", // 41
		"Mo", // 42
		"Tc", // 43
		"Ru", // 44
		"Rh", // 45
		"Pd", // 46
		"Ag", // 47
		"Cd", // 48
		"In", // 49
		"Sn", // 50
		"Sb", // 51
		"Te", // 52
		"I", // 53
		"Xe", // 54
		"Cs", // 55
		"Ba", // 56
		"La", // 57
		"Ce", // 58
		"Pr", // 59
		"Nd", // 60
		"Pm", // 61
		"Sm", // 62
		"Eu", // 63
		"Gd", // 64
		"Tb", // 65
		"Dy", // 66
		"Ho", // 67
		"Er", // 68
		"Tm", // 69
		"Yb", // 70
		"Lu", // 71
		"Hf", // 72
		"Ta", // 73
		"W", // 74
		"Re", // 75
		"Os", // 76
		"Ir", // 77
		"Pt", // 78
		"Au", // 79
		"Hg", // 80
		"Tl", // 81
		"Pb", // 82
		"Bi", // 83
		"Po", // 84
		"At", // 85
		"Rn", // 86
		"Fr", // 87
		"Ra", // 88
		"Ac", // 89
		"Th", // 90
		"Pa", // 91
		"U", // 92
		"Np", // 93
		"Pu", // 94
		"Am", // 95
		"Cm", // 96
		"Bk", // 97
		"Cf", // 98
		"Es", // 99
		"Fm", // 100
		"Md", // 101
		"No", // 102
		"Lr", // 103
		"Rf", // 104
		"Db", // 105
		"Sg", // 106
		"Bh", // 107
		"Hs", // 108
		"Mt", // 109
		"Ds", // 110
		"Rg", // 111
		"Uub", // 112
		"Uut", // 113
		"Uuq", // 114
		"Uup", // 115
		"Uuh" // 116
	};
	
	public final static int KNOWN_ELEMENTS = 116;
	
	private final static Map<String,Integer> symbolToAtomicNumberMap =
	    new HashMap<String,Integer>();

	/**
	 * Returns the atomic number of the element identified by the given symbol.
	 *
	 * @return null, if the symbol is not recognized
	 */
	public static Integer getAtomicNumber(String symbol) {
	    if (symbolToAtomicNumberMap.size() == 0)
	        fillSymbolToAtomicNumberMap();

	    return symbolToAtomicNumberMap.get(symbol);
	}

    private static void fillSymbolToAtomicNumberMap() {
        for (int i=0; i<byAtomicNumber.length; i++) {
            symbolToAtomicNumberMap.put(
                byAtomicNumber[i],
                Integer.valueOf(i)
            );
        }
    }
}
