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

package org.eclipse.ui.internal.intro.impl.model;

import org.eclipse.ui.internal.intro.impl.model.url.IntroURL;
import org.eclipse.ui.internal.intro.impl.model.url.IntroURLParser;
import org.eclipse.ui.internal.intro.impl.model.util.ModelUtil;
import org.osgi.framework.Bundle;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * An intro Link. This model class is responsible for parsing and creating an
 * IntroURL class instance if the URL happens to be a valid intro url.
 */
public class IntroLink extends AbstractTextElement {

    protected static final String TAG_LINK = "link"; //$NON-NLS-1$

    private static final String ATT_LABEL = "label"; //$NON-NLS-1$
    private static final String ATT_URL = "url"; //$NON-NLS-1$
    private static final String TAG_IMG = "img"; //$NON-NLS-1$

    private String label;
    private String url;
    private IntroImage img;
    private IntroURL introURL;

    /**
     * @param element
     */
    IntroLink(Element element, Bundle bundle, String base) {
        super(element, bundle);
        url = getAttribute(element, ATT_URL);
        label = getAttribute(element, ATT_LABEL);

        url = ModelUtil.resolveURL(base, url, bundle);
        if (url != null) {
            // check the URL.
            IntroURLParser parser = new IntroURLParser(url);
            if (parser.hasIntroUrl())
                introURL = parser.getIntroURL();
        }

        // There should be at most one img element.
        NodeList imgElements = element.getElementsByTagName(TAG_IMG);
        if (imgElements.getLength() > 0) {
            img = new IntroImage((Element) imgElements.item(0), getBundle(),
                base);
            img.setParent(this);
        }
    }

    /**
     * @return Returns the label.
     */
    public String getLabel() {
    	IntroModelRoot root = getModelRoot();
    	 if (root!=null) {
    	     return root.resolveVariables(label);
    	 }
    	 return label;
    }

    /**
     * @return Returns the url.
     */
    public String getUrl() {
        return url;
    }

    /**
     * Retruns an IntroURL instance if link has a valid intro url. Returns null
     * otherwise.
     *
     * @return Returns the introURL.
     */
    public IntroURL getIntroURL() {
        return introURL;
    }

    @Override
	public int getType() {
        return AbstractIntroElement.LINK;
    }

    /**
     * @return Returns the img.
     */
    public IntroImage getImg() {
        return img;
    }

    /**
     * Deep copy since class has mutable objects.
     */
    @Override
	public Object clone() throws CloneNotSupportedException {
        IntroLink clone = (IntroLink) super.clone();
        if (img != null) {
            IntroImage cloneIntroImage = (IntroImage) img.clone();
            cloneIntroImage.setParent(clone);
            clone.img = cloneIntroImage;
        }
        // no need to clobe IntroURL.
        return clone;
    }
}
