/*******************************************************************************
 * Copyright (c) 2005, 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.engines.blind.html.internal.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


public class VisualizeMapDataImpl implements IVisualizeMapData {

    private Map<Node, Node> orig2resultMap = new HashMap<Node, Node>(1024); //orig node <> result node

    private Map<Node, Node> result2origMap = new HashMap<Node, Node>(1024); //result node <> orig node

    private Map<Node, Integer> orig2idMap = new HashMap<Node, Integer>(1024); //orig node <> result node's id

    private Map<Node, Integer> result2idMap = new HashMap<Node, Integer>(1024); //result node <> result node's id

    private Map<Integer, Integer> accId2id = new HashMap<Integer, Integer>(1024);

    private Map<Integer, Integer> id2accId = new HashMap<Integer, Integer>(1024);

    private Map<Node, VisualizationNodeInfo> node2infoMap = new HashMap<Node, VisualizationNodeInfo>(1024);

    private Map<Node, Node> removedNodeMap = new HashMap<Node, Node>(512);

    private Map<Node, Node> intraPageLinkMap = new HashMap<Node, Node>(256);

    private List<VisualizationNodeInfo> nodeInfoList = new ArrayList<VisualizationNodeInfo>(1024);

    /**
     *  
     */
    public VisualizeMapDataImpl() {

    }

    protected Map getOrig2ResultMap() {
        return (orig2resultMap);
    }

    /**
     * @return Returns the accId2idMap.
     */
    protected Map getAccId2IdMap() {
        return accId2id;
    }

    /**
     * @return Returns the id2accIdMap.
     */
    public Map getId2AccIdMap() {
        return id2accId;
    }

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#getOrig2idMap()
	 */
    public Map getOrig2idMap() {
        return orig2idMap;
    }

    /**
     * @return Returns the result2idMap.
     */
    public Map getResult2idMap() {
        return result2idMap;
    }

    /**
     * @return Returns the intraPageLinkMap.
     */
    protected Map getIntraPageLinkMap() {
        return intraPageLinkMap;
    }

    /**
     * @return Returns the nodeInfoList.
     */
    public List getNodeInfoList() {
        return nodeInfoList;
    }

    /**
     * @return Returns the node2infoMap.
     */
    protected Map getNode2infoMap() {
        return node2infoMap;
    }

    //

    protected void addOrigResultMapping(Node orig, Node result) {
        orig2resultMap.put(orig, result);
        result2origMap.put(result, orig);
    }

    public void addOrigIdAccIdMapping(Integer orig, Integer acc) {
        accId2id.put(acc, orig);
        id2accId.put(orig, acc);
    }

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#addReplacedNodeMapping(org.w3c.dom.Node, org.w3c.dom.Node)
	 */
    public void addReplacedNodeMapping(Node result, Node replacement) {
        removedNodeMap.put(result, replacement);
    }

    protected void addNodeIdMapping(Node result, Integer id) {
        result2idMap.put(result, id);
        orig2idMap.put(getOrigNode(result), id);
    }

    protected void addNodeInfoMapping(Node result, VisualizationNodeInfo nodeInfo) {
        node2infoMap.put(result, nodeInfo);
    }

    protected void addNodeInfoIntoList(VisualizationNodeInfo info) {
        nodeInfoList.add(info);
    }

    protected void addIntraPageLinkMapping(Node source, Node dest) {
        intraPageLinkMap.put(source, dest);
    }

    //

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#getOrigNode(org.w3c.dom.Node)
	 */
    public Node getOrigNode(Node result) {
        return (Node) result2origMap.get(result);
    }

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#getResultNode(org.w3c.dom.Node)
	 */
    public Node getResultNode(Node orig) {
        return (Node) orig2resultMap.get(orig);
    }

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#getReplacement(org.w3c.dom.Node)
	 */
    public Node getReplacement(Node result) {
        return (Node) removedNodeMap.get(result);
    }

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#getIdOfNode(org.w3c.dom.Node)
	 */
    public Integer getIdOfNode(Node result) {
        return (Integer) result2idMap.get(result);
    }

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#getIdOfOrigNode(org.w3c.dom.Node)
	 */
    public Integer getIdOfOrigNode(Node orig) {
        return (Integer) orig2idMap.get(orig);
    }

    /* (non-Javadoc)
	 * @see org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData#getNodeInfo(org.w3c.dom.Node)
	 */
    public  VisualizationNodeInfo getNodeInfo(Node result) {
        return (VisualizationNodeInfo) node2infoMap.get(result);
    }

    public void makeIdMapping(String targetIdS){
		Set nodeSet = getResult2idMap().keySet();
		Iterator it = nodeSet.iterator();
		while (it.hasNext()) {
			Node node = (Node) it.next();
			if (node.getNodeType() == Node.ELEMENT_NODE) {
				Integer targetId = getIdOfNode(node);
				Element tmpE = (Element) node;
				tmpE.setAttribute("id", "id" + (targetId.toString()));

				if (tmpE.hasAttribute(targetIdS)) {
					try {
						Integer accId = new Integer(tmpE
								.getAttribute(targetIdS));
						addOrigIdAccIdMapping(targetId, accId);
					} catch (Exception e) {
					}
				}
				DocumentCleaner.removeOnMouse((Element) node);
			}
		}

    }
    
    
}
