/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2008 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/

#ifndef CREFERENCEMANAGER_H
#define CREFERENCEMANAGER_H

#include "backend/drivers/cswordmoduleinfo.h"

//Qt includes
#include <QString>

/** Contains static functions to work with references used for Drag & Drop and for hyperlinks used in our
 * rendered HTML code.
 * @author The BibleTime team
 */

class CReferenceManager {

public:
	enum Type {
		Bible, /**< Bibles */
		Commentary, /**< Commentary */
		Lexicon, /**< Lexicon */
		GenericBook, /**< Generic Book */
		MorphHebrew, /**< Module for hebrew morphology*/
		MorphGreek, /**< Module for greek morphology */
		StrongsHebrew, /**< Module for hebrew strongs */
		StrongsGreek, /**< Module for greek strongs */
		Unknown /**< Unknown */
	};

	/** Turn a hyperlink into module, key and type.
	* Decodes the given hyperlink into module, key and type.
	* @param hyperlink The hyperlink to decode
	* @param module The string which will contain the module name after decoding
	* @param key The string which will contain the key after decoding
	* @param type The type param will contain the reference type after decoding
	*/
	static bool decodeHyperlink( const QString& hyperlink, QString& module, QString& key, Type& type);
	/**
	* Returns a hyperlink used to be embedded in the display windows.
	* At the moment the format is sword://module/key
	* @param module The module which is used to encode the hyperlink
	* @param key The key which is used to encode the hyperlink
	* @param type The type which is used to encode the hyperlink
	* @return The encoded hyperlink
	*/
	static const QString encodeHyperlink( const QString module, const QString key, const Type type);
	/**
	* Puts a module Name and a Reference together in the 'draggable' form
	* (module)reference
	* @param module The name of the module
	* @param reference The key reference as text
	* @return The encoded reference using module and reference
	* @author Martin Gruner
	*/
	static const QString encodeReference(const QString &module, const QString &reference);
	/**
	* decodes a 'draggable' reference into a modulename and a reference
	* @author Martin Gruner
	*/
	static void decodeReference(QString &dragreference, QString &module, QString &reference);
	/**
	* Returns true if the parameter is a hyperlink.
	* @param hyperlink The string which is tested
	* @return True if the passed string is a hyperlink
	*/
	static bool isHyperlink( const QString& hyperlink );
	/**
	* Returns the preferred module name for the given type.
	* @param type The type which is used to find the module
	* @return The default module name for the passed type
	*/
	static const QString preferredModule( const Type type );
	/**
	* Returns the type of the passed module type
	* @param type The CSwordModuleInfo module typpe
	* @return The ReferenceManager type
	*/
	static CReferenceManager::Type typeFromModule( const CSwordModuleInfo::ModuleType type );


	struct ParseOptions {
		QString refDestinationModule;
		QString refBase; /* only valid for verse based destination modules*/
		QString sourceLanguage; /* only valid for verse based destination modules*/
		QString destinationLanguage; /* only valid for verse based destination modules*/

		ParseOptions() {
			destinationLanguage = "en";
		};
	};

	/** Parses the given verse references using the given language and the module.
	* @param moduleName The name of the module to use. Required for the language checking before parsing the key.
	* @param ref The verse reference.
	* @param lang The language of the verse reference
	* @param newLang The language of the reference, which will be returned. For example: If BibleTime using an english environment parses a spanish ref (lang=es) the returned ref should be in english (newLang=en), because his english standard module only understands en.
	*/
	static const QString parseVerseReference( const QString& ref, const ParseOptions& options);
};

#endif

