/*******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation 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:
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.visualization.eval.html;

import java.util.HashSet;
import java.util.Set;
import java.util.Stack;

import org.eclipse.actf.util.IHtmlEventHandlerAttributes;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class HtmlTagUtil implements IHtmlEventHandlerAttributes {

    public static final String ATTR_HREF = "href";

    public static final String ATTR_ALT = "alt";

    public static final String ATTR_SRC = "src";

    
    public static final String FLASH_OBJECT = "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000";

    public static final String FLASH_CODEBASE = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab";

    public static final String FLASH_TYPE = "application/x-shockwave-flash";

    public static final String FLASH_PLUGINSPAGE = "http://www.macromedia.com/go/getflashplayer";

    private static final String[] BLOCK_ELEMENT = { "address", "blockquote", "center", "dir", "div", "dl", "fieldset",
            "form", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "isindex", "menu", "noframes", "noscript", "ol", "p",
            "pre", "table", "ul", "dd",
            //inline? "dt",
            "frameset", "li", "tbody", "td", "tfoot", "th", "thead", "tr" };

    public static Set<String> getBlockElementSet() {
        Set<String> blockEleSet = new HashSet<String>();
        for (int i = 0; i < BLOCK_ELEMENT.length; i++) {
            blockEleSet.add(BLOCK_ELEMENT[i]);
        }
        return (blockEleSet);
    }

    // move from checkers
    //TODO use xpath
    public static boolean hasAncestor(Node target, String ancesterName) {
        boolean result = false;
        Node tmpNode = target;
        while (tmpNode != null) {
            if (tmpNode.getNodeName().equals(ancesterName)) {
                result = true;
                break;
            }
            tmpNode = tmpNode.getParentNode();
        }
        return (result);
    }

    public static String getNoScriptText(Node target) {
        StringBuffer tmpSB = new StringBuffer();
        if (target.getNodeType() == Node.ELEMENT_NODE) {
            Element tmpE = (Element) target;
            //TBD check neighbor?
            if (tmpE.getElementsByTagName("script").getLength() > 0) {
                NodeList tmpNL = tmpE.getElementsByTagName("noscript");
                for (int i = 0; i < tmpNL.getLength(); i++) {
                    tmpSB.append(getTextAltDescendant(tmpNL.item(i)));
                }
            }
        }
        return tmpSB.toString();
    }

    public static String getTextAltDescendant(Node target) {
        Node curNode = target.getFirstChild();
        StringBuffer strBuf = new StringBuffer(512);
        Stack<Node> stack = new Stack<Node>();
        while (curNode != null) {
            if (curNode.getNodeType() == Node.TEXT_NODE) {
                strBuf.append(curNode.getNodeValue().trim() + " ");
            } else if (curNode.getNodeName().equalsIgnoreCase("img")) { //$NON-NLS-1$
                strBuf.append(((Element) curNode).getAttribute(ATTR_ALT).trim() + " "); //$NON-NLS-1$
            }

            if (curNode.hasChildNodes()) {
                stack.push(curNode);
                curNode = curNode.getFirstChild();
            } else if (curNode.getNextSibling() != null) {
                curNode = curNode.getNextSibling();
            } else {
                curNode = null;
                while ((curNode == null) && (stack.size() > 0)) {
                    curNode = (Node) stack.pop();
                    curNode = curNode.getNextSibling();
                }
            }
        }

        return strBuf.toString();
    }

    public static String getTextDescendant(Node target) {
        Node curNode = target.getFirstChild();
        StringBuffer strBuf = new StringBuffer(512);
        Stack<Node> stack = new Stack<Node>();
        while (curNode != null) {
            if (curNode.getNodeType() == Node.TEXT_NODE) {
                strBuf.append(curNode.getNodeValue());
            }

            if (curNode.hasChildNodes()) {
                stack.push(curNode);
                curNode = curNode.getFirstChild();
            } else if (curNode.getNextSibling() != null) {
                curNode = curNode.getNextSibling();
            } else {
                curNode = null;
                while ((curNode == null) && (stack.size() > 0)) {
                    curNode = (Node) stack.pop();
                    curNode = curNode.getNextSibling();
                }
            }
        }

        return strBuf.toString();
    }

    // move from checkers
    //TODO use xpath

    public static boolean hasTextDescendant(Node target) {
        Node curNode = target.getFirstChild();
        Stack<Node> stack = new Stack<Node>();
        while (curNode != null) {
            if (curNode.getNodeType() == Node.TEXT_NODE) {
                return (true);
            }

            if (curNode.hasChildNodes()) {
                stack.push(curNode);
                curNode = curNode.getFirstChild();
            } else if (curNode.getNextSibling() != null) {
                curNode = curNode.getNextSibling();
            } else {
                curNode = null;
                while ((curNode == null) && (stack.size() > 0)) {
                    curNode = (Node) stack.pop();
                    curNode = curNode.getNextSibling();
                }
            }
        }
        return (false);
    }

}
