/***************************************************************************

    libdope
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


#ifndef DDWEBOVERLAYMAP_H
#define DDWEBOVERLAYMAP_H

#include <ddstringrow.h>
#include <ddthreadmutex.h>
#include <set>
#include <ddstringset.h>
#include <ddmaprow.h>

/**
	Overlaylinks:
	
	Overlaylinks verlinkenwichtige Keywords ('festplatte', 'vista' ... ) mit faqs.
	Sie werden  automatisch in Anfragen, News & Faqs eingeblendet, nicht jedoch in Antworten & Kommentaren,
	um die maximale Linkdicht nicht zu überschreiten. Per config sind folgende parameter eintellbar:
	
	word_to_link_ratio=5;			Linkdichte, also das Verhältnis zwischen links und der Wortanzahl eines Artikels
	replace_link_occurence=1;	Das wievielte Vorkommen eines Keywords wird ersetzt? Normalerweise gleich das erste,
														kann aber auch das 2. bzw. n-te sein.
	max_links_to_replace=5;		Wieviele Links werden pro Artikel ersetzt?
										
	
	Der Algorithmus:
	
	Typischer Block:
	
	Stichworte:	festplatte, festplatten, festplatten formatieren
	Link:	/faqsthread/2266136
	Kommentar:	kommentar
	
	Die Blöcke werden in eine Liste zerlegt: 
	
	festplatte 
	festplatten 
	festplatten formatieren
	...
	
	Vorgehen bei Postings:
	
	Ersetzungen werden automatisch vorgenommen. Die Liste wird der Reihe nach durchsucht, wenn ein ausdruck gefunden
	 und ersetzt wurde, wird er ans ende der Liste verlegt, um beim nächsten Durchlauf die anderen Ausdrücke zu bevorzugen.
	Beim ersetzen muss darauf geachtet werden, dass nicht innerhalb von link- oder code-tags ersetzt wird. Jeder Ziel-link
	darf pro posting nur einmal verwendet werden.
	
	Vorgehen bei Replies:
	
	Ersetzungen werden nicht automatisch vorgenommen, es existiert ein button 'Links vorschlagen', der ein popup-layer erzeugt,
	in dem Ersetzungsvorschläge aufgelistet sind. Beim klick auf einen Vorschlag wird dieser per Javascript in den Text übernommen.
	Bei Erstellung der Vorschlags-Liste muss darauf geachtet werden, dass nicht innerhalb von link- oder code-tags ersetzt wird.
	Es sollen alle machbaren Ersetzungen vorgeschlagen werden, nicht nur das 'First-match'
	
	BUG: da die Ersetzung per Javascript 'offline' erfolgt, können linkdichte etc. nicht überprüft werden.
	
	
	
	Overlayimages:
	
	...
	
*/

/// ddweboverlay: ein overlay link
/**
	ddweboverlay: ein overlay link
*/

struct ddweboverlaylink
{
	
	ddstring		key;
	ddstring		link;
	ddstring		comment;
	
	ddweboverlaylink()
	{
	}
		
	ddweboverlaylink( const ddstring& akey, const ddstring& alink, const ddstring& acomment )
	: key( akey ), link( alink ), comment( acomment ) 
	{
	}
	
	inline ddstring to_string() const
	{
		return key + "|" + link + "|" + comment + "\n";
	}	
	
};


/***************************************************************************

    libdope
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/

/// ddweboverlayblinklock: Speichert Blöcke mit overlay-links
/**
	
	Die Blöcke müssen dann in Einzellinks aufgeteilt werden:
	
	DB Format:
	
	Stichworte:	irfanview, irfanview software, irfanview laden
	Link:	/faqsthread/2266136
	Kommentar:	kommentar
	
	...
	
*/

struct ddweboverlaylinkblock
{
	
	ddstring		keyblock;
	ddstring		link;
	ddstring		comment;
		
	ddweboverlaylinkblock( const ddstring& akeyblock, const ddstring& alink, const ddstring& acomment )
	: keyblock( akeyblock ), link( alink ), comment( acomment ) 
	{
	}
	
	inline ddstring to_string() const
	{
		return keyblock + "|" + link + "|" + comment + "\n";
	}	
	
};



/***************************************************************************

    libdope
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/

/// ddweboverlaymap: eine maprow für overlaylinks
/**
	ddweboverlaymap: eine maprow für overlaylinks, wird als
	'workingset' benötigt, d.h. 
*/

class ddweboverlaylinkmap : public ddmaprow<ddweboverlaylink>
{

public:

	void dump() const
	{
		for( int i=0; i<size(); ++i )
		 cout << (*this)[i].to_string();
	}
	
	// PFUSCH
	int find_link_tag( const ddstring& akey )
	{
		for( int i=0; i<size(); ++i )
		{
		 if( (*this)[i].key == akey )
		 	return i;
		}
		return -1;
	}

};

/***************************************************************************

    libdope
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


/// ddweboverlaylinks: Vector aus Overlayblöcken, verwaltet Overlayblöcke, ersetzt Links.
/**
	ddweboverlaylinks: Verwaltet Overlayblöcke, Vector aus Overlayblöcken, ersetzt Links.
*/

class ddweboverlaylinks : public vector<ddweboverlaylinkblock>
{

public:

	ddweboverlaylinks();
	virtual ~ddweboverlaylinks();
	
	void init_properties( size_t linkratio, size_t linkreplacements, size_t linkoccurence )
	{		
		_linkratio 				= linkratio;
		_linkreplacements = linkreplacements;
		_linkoccurence		= linkoccurence; 
	}
	
	virtual ddstring to_string();
	virtual void from_string( const ddstring& src );
	
	virtual void update_entry( size_t index, const ddstring& keyblock, const ddstring& link, const ddstring& comment );
	virtual void add_entry( const ddstring& keyblock, const ddstring& link, const ddstring& comment );
	virtual void drop_entry( size_t index );
	
	void replace_keys( ddstring& text );
	
	void dump() const
	{
		for( size_t i=0; i<size(); ++i )
		 cout << (*this)[i].to_string();
	}
	
	virtual bool find_link_tag( const ddstring& key, ddweboverlaylink& entry );
	virtual bool find_link_tags( const ddstring& block, ddweboverlaylinkmap& list );
	virtual bool check_tag_position( const ddstring& src, size_t idx );

protected:		
	
	virtual void create_overlays();
	virtual void create_overlay_links( const ddweboverlaylinkblock& entry );
	virtual bool replace_entry( const ddweboverlaylink& entry, ddstring& target );
	virtual void rotate_entry( size_t index );
		
	ddthreadmutex				_blockmutex;			
	set<ddstring>				_linkset;
	ddweboverlaylinkmap	_workingset;
	ddstring						_lowtext;
	size_t							_numlinks;
	
	size_t							_linkratio;
	size_t							_linkreplacements;
	size_t							_linkoccurence;
	
};


/***************************************************************************

    supportware
    Copyright (C) 2001-2007 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


class ddweboverlayimages : public ddweboverlaylinks
{

public:

	ddweboverlayimages()
	{
	}
	
	~ddweboverlayimages()
	{
	}
	
	void init_stop_words( const ddstring& stopwords, const ddstring& domainname );
		
	void replace_keys( ddstring& text, ddstring& subject );

protected:		
	
	
	virtual bool replace_entry( const ddweboverlaylink& entry, ddstring& target );
	
	ddstringset	_stopwords;
	ddstring		_domainname;		
	
};


#endif
