/*******************************************************************************
 * 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 {
	/**
	 * 
	 */
	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);
	}

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

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

	/**
	 * 
	 */
	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;
}
