/*******************************************************************************
 * 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.jst.pagedesigner.IHTMLConstants;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.value.Length;
import org.eclipse.jst.pagedesigner.utils.DOMUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * @author mengbo
 */
public class PaddingWidthMeta extends LengthMeta {
    
    private static int MIN_PADDING_THRESHOLD = 4;

	/**
	 * @param inherit
	 * @param initvalue
	 */
	public PaddingWidthMeta() {
		super(false, ICSSPropertyID.VAL_AUTO);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
	 *      java.lang.String, java.lang.String,
	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
	 */
	public Object calculateHTMLAttributeOverride(Element element,
			String htmltag, String propertyName, ICSSStyle style) {
		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
			Node parent = element;
			Element tableEle = null;
			while ((parent = parent.getParentNode()) != null
					&& parent instanceof Element) {
				if (((Element) parent).getTagName().equalsIgnoreCase(
						IHTMLConstants.TAG_TABLE)) {
					tableEle = (Element) parent;
					break;
				}
			}
			if (tableEle != null) {
				//TODO:  Why is only cellpadding being checked?  Why does this class even exist?  What is difference with BorderWidthMeta?   
				String padding = DOMUtil.getAttributeIgnoreCase(tableEle,
						"cellpadding");//$NON-NLS-1$
				if (padding != null && padding.trim().length() > 0) {//fix for 200592						
					Object length = LengthMeta.toLength(padding, style, this
								.getPercentageType(), getBaseFont(style));
                    if (length instanceof Length && ((Length)length).getValue() >= MIN_PADDING_THRESHOLD)                    
                        return length;
                    
				}
                // TODO should not be hardcoded value.  Either should change to a pref
                // or a per-component customization.
                return new Length(MIN_PADDING_THRESHOLD, false);
			}
		}
		return super.calculateHTMLAttributeOverride(element, htmltag,
				propertyName, style);
	}
}
