/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.css2.property;

import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
import org.w3c.dom.css.CSSPrimitiveValue;

/**
 * copied from wtp's internal code.
 * 
 * @author mengbo
 */
public final class FloatInfo {
	/**
	 * @param text 
	 */
	public FloatInfo(String text) {
		parse(text);
	}

	/**
	 * 
	 */
	void parse(String text) {
		StringBuffer bufValue = new StringBuffer();
		StringBuffer bufIdent = new StringBuffer();
		boolean bNum = true;
		int len = text.length();
		for (int i = 0; i < len; i++) {
			char c = text.charAt(i);
			if (bNum) {
				if ('0' <= c && c <= '9' || c == '.' || c == '+' || c == '-') {
					bufValue.append(c);
				} else {
					bufIdent.append(c);
					bNum = false;
				}
			} else {
				bufIdent.append(c);
			}
		}
		String valueStr = bufValue.toString();
		_value = Float.valueOf(valueStr).floatValue();
		_identifier = bufIdent.toString();
		_type = getFloatValueType(valueStr, _identifier);
	}

	/**
	 * @return the value
	 * 
	 */
	public float getValue() {
		return _value;
	}

	/**
	 * 
	 */
	String getIdentifier() {
		return _identifier;
	}

	/**
	 * @return the value type
	 */
	public short getValueType() {
		return _type;
	}

	/**
	 * 
	 */
	static short getFloatValueType(String value, String ident) {
		ident = ident.toLowerCase();
		short valueType;
		if (ident.length() == 0) {
			if (0 <= value.indexOf('.')) {
				valueType = CSSPrimitiveValue.CSS_NUMBER;
			} else {
				valueType = ICSSPrimitiveValue.CSS_INTEGER;
			}
		} else if (ident.equals("%")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_PERCENTAGE;
		} else if (ident.equalsIgnoreCase("em")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_EMS;
		} else if (ident.equalsIgnoreCase("ex")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_EXS;
		} else if (ident.equalsIgnoreCase("px")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_PX;
		} else if (ident.equalsIgnoreCase("cm")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_CM;
		} else if (ident.equalsIgnoreCase("mm")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_MM;
		} else if (ident.equalsIgnoreCase("in")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_IN;
		} else if (ident.equalsIgnoreCase("pt")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_PT;
		} else if (ident.equalsIgnoreCase("pc")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_PC;
		} else if (ident.equalsIgnoreCase("deg")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_DEG;
		} else if (ident.equalsIgnoreCase("rad")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_RAD;
		} else if (ident.equalsIgnoreCase("grad")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_GRAD;
		} else if (ident.equalsIgnoreCase("ms")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_MS;
		} else if (ident.equalsIgnoreCase("s")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_S;
		} else if (ident.equalsIgnoreCase("hz")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_HZ;
		} else if (ident.equalsIgnoreCase("khz")) {
			//$NON-NLS-1$
			valueType = CSSPrimitiveValue.CSS_KHZ;
		} else {
			valueType = CSSPrimitiveValue.CSS_DIMENSION;
		}
		return valueType;
	}

	private float _value = 0.0f;

	private String _identifier = null;

	private short _type = CSSPrimitiveValue.CSS_UNKNOWN;
}
