//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.publishing.services;

import java.awt.Image;
import java.io.File;

import javax.imageio.ImageIO;

import org.eclipse.epf.library.layout.elements.ActivityLayout;

/**
 * Extends tbe basic publish options to include HTML options.
 * 
 * @author Kelvin Low
 * @since 1.2
 */
public class PublishHTMLOptions extends PublishOptions {

	// The HTML title.
	protected String title;

	// The about HTML.
	protected String aboutHTML;

	// The feedback URL.
	protected String feedbackURL;

	// Publish glossary option.
	protected boolean publishGlossary;

	// Publish index option.
	protected boolean publishIndex;

	// The banner image.
	protected String bannerImage;
	
	protected int bannerImageHeight = 67; // banner image height, can we auto calc it???

	// Check external links option.
	protected boolean checkExternalLinks;

	// Convert broken links to plain text option.
	protected boolean convertBrokenLinks;

	// Publish JavaScript navigation tree option.
	protected boolean publishJavaScriptTree = true;

	// Publish dynamic web application option.
	protected boolean publishDynamicWebApp;

	// The dynamic web application name.
	protected String dynamicWebAppName;

	// Include servlet search option.
	protected boolean includeServletSearch;

	// define the default activity tab
	protected String defaultActivityTab = ActivityLayout.TAB_NAME_ACTIVITY_WBS;
	
	/**
	 * Creates a new instance.
	 */
	public PublishHTMLOptions() {
	}

	/**
	 * Creates a new instance.
	 */
	public PublishHTMLOptions(PublishOptions options) {
		this.publishDir = options.getPublishDir();
		this.processes = options.getProcesses();
		this.publishConfiguration = options.isPublishConfiguration();
		this.publishProcess = options.isPublishProcess();
		this.publishUnopenADD = options.isPublishUnopenADD();
		this.publishBaseAD = options.isPublishBaseAD();
		this.publishLightWeightTree = options.isPublishLightWeightTree();
		this.publishEmptyCategories = options.isPublishEmptyCategories();
		this.showMethodContentInDescriptors = options
				.isShowMethodContentInDescriptors();
		this.showRelatedDescriptors = options.isShowRelatedDescriptors();
		this.showDescriptorsInNavigationTree = options
				.isShowDescriptorsInNavigationTree();
		this.publishEmptyCategories = options.isPublishEmptyCategories();
	}

	/**
	 * Gets the HTML title.
	 * 
	 * @return the HTML title
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * Sets the HTML title.
	 * 
	 * @param title
	 *            the HTML title
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	/**
	 * Gets the About HTML.
	 * 
	 * @return the About HTML
	 */
	public String getAboutHTML() {
		return aboutHTML;
	}

	/**
	 * Sets the About HTML.
	 * 
	 * @param aboutHTML
	 *            the About HTML
	 */
	public void setAboutHTML(String aboutHTML) {
		this.aboutHTML = aboutHTML;
	}

	/**
	 * Gets the feedback URL.
	 * 
	 * @return the feedback URL
	 */
	public String getFeedbackURL() {
		return feedbackURL;
	}

	/**
	 * Sets the feedback URL.
	 * 
	 * @param feedbackURL
	 *            the feedback URL
	 */
	public void setFeedbackURL(String feedbackURL) {
		this.feedbackURL = feedbackURL;
	}

	/**
	 * Gets the publish glossary option.
	 * 
	 * @return <code>true</code> if the glossary needs to be published
	 */
	public boolean isPublishGlossary() {
		return publishGlossary;
	}

	/**
	 * Sets the publish glossary option.
	 * 
	 * @param publishGlossary
	 *            if <code>true</code>, publish the glossary
	 */
	public void setPublishGlossary(boolean publishGlossary) {
		this.publishGlossary = publishGlossary;
	}

	/**
	 * Gets the publish index option.
	 * 
	 * @return <code>true</code> if the index needs to be published
	 */
	public boolean isPublishIndex() {
		return publishIndex;
	}

	/**
	 * Sets the publish index option.
	 * 
	 * @param publishIndex
	 *            if <code>true</code>, publish the index
	 */
	public void setPublishIndex(boolean publishIndex) {
		this.publishIndex = publishIndex;
	}

	/**
	 * Gets the banner image.
	 * 
	 * @return the banner image
	 */
	public String getBannerImage() {
		return bannerImage;
	}

	/**
	 * Sets the banner image.
	 * 
	 * @param bannerImage
	 *            the banner image
	 */
	public void setBannerImage(String bannerImage) {
		this.bannerImage = bannerImage;
		
		// set the height of the banner
		Image image = null;
		File f = new File(this.bannerImage);
		if ( f.exists() ) {
			try {
				image = ImageIO.read(f);
				if ( image != null ) {
					int height = image.getHeight(null);
					if ( height > 0 ) {
						this.bannerImageHeight = height;
					}
				}
			} catch (Exception ex ) {
				// error read the file, ignore error and use the default banner height
				;
			} finally {
			}
		}
	}

	/**
	 * Gets the banner image.
	 * 
	 * @return the banner image height
	 */
	public int getBannerImageHeight() {
		return bannerImageHeight;
	}

	/**
	 * Sets the banner image.
	 * 
	 * @param bannerImage
	 *            the banner image height in pixels
	 */
	public void setBannerImageHeight(int bannerImageheight) {
		this.bannerImageHeight = bannerImageheight;
	}
	
	/**
	 * Gets the check external links option.
	 * 
	 * @return <code>true</code> if the external links need to be checked
	 */
	public boolean isCheckExternalLinks() {
		return checkExternalLinks;
	}

	/**
	 * Sets the check external links option.
	 * 
	 * @param checkExternalLinks
	 *            if <code>true</code>, check the external links
	 */
	public void setCheckExternalLinks(boolean checkExternalLinks) {
		this.checkExternalLinks = checkExternalLinks;
	}

	/**
	 * Gets the convert broken links option.
	 * 
	 * @return <code>true</code> if the convert broken links need to be
	 *         converted to plain text
	 */
	public boolean isConvertBrokenLinks() {
		return convertBrokenLinks;
	}

	/**
	 * Sets the convert broken links option.
	 * 
	 * @param convertBrokenLinks
	 *            if <code>true</code>, convert broken links to plian text
	 */
	public void setConvertBrokenLinks(boolean convertBrokenLinks) {
		this.convertBrokenLinks = convertBrokenLinks;
	}

	/**
	 * Gets the publish JavaScript navigation tree option.
	 * 
	 * @return <code>true</code> if a JavaScript navigation tree will be
	 *         published
	 */
	public boolean isPublishJavaScriptTree() {
		return publishJavaScriptTree;
	}

	/**
	 * Sets the publish JavaScript navigation tree option.
	 * 
	 * @param publishJavaScriptTree
	 *            if <code>true</code>, publish a JavaScript navigation tree
	 */
	public void setPublishJavaScriptTree(boolean publishJavaScriptTree) {
		this.publishJavaScriptTree = publishJavaScriptTree;
	}

	/**
	 * Gets the publish dynamic web application option.
	 * 
	 * @return <code>true</code> if a dynamic web application will be
	 *         published
	 */
	public boolean isPublishDynamicWebApp() {
		return this.publishDynamicWebApp 
		&& (this.dynamicWebAppName != null)
		&& (this.dynamicWebAppName.length() > 0);
	}

	/**
	 * Sets the publish dynamic web application option.
	 * 
	 * @param publishDynamicWebApp
	 *            if <code>true</code>, publish a dynamic web application
	 */
	public void setPublishDynamicWebApp(boolean publishDynamicWebApp) {
		this.publishDynamicWebApp = publishDynamicWebApp;
	}

	/**
	 * Gets the dynamic web application name.
	 * 
	 * @return the dynamic web application name
	 */
	public String getDynamicWebAppName() {
		return dynamicWebAppName;
	}

	/**
	 * Sets the dynamic web application name.
	 * 
	 * @param dynamicWebAppName
	 *            the dynamic web application name.
	 */
	public void setDynamicWebAppName(String dynamicWebAppName) {
		this.dynamicWebAppName = dynamicWebAppName;
	}

	/**
	 * Gets the include servlet search option.
	 * 
	 * @return <code>true</code> if include servlet search will be added to
	 *         the published dynamic web application
	 */
	public boolean isIncludeServletSearch() {
		return includeServletSearch && isPublishDynamicWebApp();
	}

	/**
	 * Sets the include servlet search option.
	 * 
	 * @param includeServletSearch
	 *            if <code>true</code>, include servlet search in the
	 *            published dynamic web application
	 */
	public void setIncludeServletSearch(boolean includeServletSearch) {
		this.includeServletSearch = includeServletSearch;
	}

	/**
	 * get the default activity tab
	 * @return String
	 */
	public String getDefaultActivityTab() {
		return this.defaultActivityTab;
	}
	
	/**
	 * set the default activity tab
	 * @param tabName
	 */
	public void setDefaultActivityTab(String tabName) {
		this.defaultActivityTab = tabName;
	}
	
	/**
	 * Validates the publish options.
	 * 
	 * @return <code>true</code> if the publish options is valid.
	 */
	public void validate() {
		super.validate();
		
	}
}
