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

    supportware
    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.

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

#include <ddwebdossier.h>


/**
	Dossiermap aufbauen
*/

void ddwebdossiermap::init_dossier_data( const ddwebview& table, ddwebview& dossiertable )
{
	
	clear();
	
	// Interne Dossiertabelle nach IDs zusammenbasteln
	for( int x=0; x<table.size(); ++x )
	{ 
		const dddatastaterow& row = table[x];		
		
		// 1. dossier intern nach ID speichern
		const ddstring& mainid = row[0];
		ddwebdossier& dossier = *( new ddwebdossier( mainid, row[1], row[2] ) ); 
		
		_dossiers.add_by_key( mainid, &dossier );		
		
		// 2. die im dossier enthaltenen tipps-IDs als externe schlüssel verwenden.
		ddstringrow& keys = dossier.entries;
		for( size_t i=0; i<keys.size(); i++ )
			(*this)[ keys[i] ] = mainid;
		
		// 3. für jeden dossiereintrag die subjects einsammeln
		dossiertable.fill( "on_fetch_dossier", row[2] );
		for( int j=0; j<dossiertable.size(); ++j )
			dossier.add_at_key( dossiertable[j][0], dossiertable[j][1] );
		
	}
	

}

/**
	Findet die 'Nächster/Vorheriger Eintrag' Links eines Dossiers.
*/



void ddwebdossiermap::get_neighbors( const ddstring& id, ddstring& lst, ddstring& nxt )
{
	// gibbet überhaupt ein dossier für diesen tipp?
	if( !contains_key( id ) )
		return;
	
	// jawoll, es gibt eins, dann die nachbareinträge suchen
	ddstringrow& entries = get_entry( id ).entries;
	for( size_t i=0; i<entries.size(); ++i )			
	{
		// eintrag gefunden ...
		if( entries[i] == id )
		{
			// nicht der letzte
			if( i < entries.size()-1 )
				nxt = entries[i+1];
			// nicht der erste
			if( i > 0 )
				lst = entries[i-1];

		}
	}
			
}
	
	
/***************************************************************************

    supportware
    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.

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


/**
 Tie Toofe Tatenpank hält sich nicht an die reihenfolge der Abfrage:
 select id, sn_msgsubject from tr_msgmain 
		where id in ( 2172323,2172242,2172008,2123218,2172334,2172404,2172454 )
	gibt die ids in reihenfolge des index zurück, logisch.
	
	Also müssen die einträge im speicher in die richtige reihenfolge gebracht werden.
	

*/

void ddwebdossier::add_at_key( const ddstring& id, const ddstring& asubject)
{
	// id suchen
	for( size_t i=0; i<entries.size(); ++i )
	{
		// gefunden
		if( id == entries[i] )
			subjects[i] = asubject;
	}
}



void ddwebdossier::swap_elements( size_t oldidx, size_t newidx )
{
	ddstring tmp = subjects[newidx];
	subjects[newidx] = subjects[oldidx];
	subjects[oldidx] = tmp;
	
	tmp = entries[newidx];
	entries[newidx] = entries[oldidx];
	entries[oldidx] = tmp;
}



void ddwebdossier::action_at_key( const ddstring& id, const ddstring& subject, const ddstring& actionstr )
{
	
	// id suchen
	_changed = false;
	
	if( actionstr == "entry_add" )
	{
		subjects.add( subject );
		entries.add( id );
		_changed = true;	
		return;
	}
	
	
	for( size_t i=0; i < entries.size(); ++i )
	{
		// gefunden
		if( id == entries[i] )
		{
			if( actionstr == "entry_up" )
			{
				// eintrag hochschieben
				swap_elements( i, i == 0 ? entries.size() - 1 : i - 1 );
			}
			else if( actionstr == "entry_down" )
			{
				// eintrag runteschieben
				swap_elements( i, i == entries.size()-1 ? 0 : i + 1 );			
			}
			else if( actionstr == "entry_kill" )
			{
			 	subjects.erase ( subjects.begin()+i );
				entries.erase ( entries.begin()+i );
			}
			
			_changed = true;	
		}
	}
}


/**
	Ein Dossier in die entpsrechende Box rendern.
*/

ddstring ddwebdossier::render_dossier_box( const ddstring& id, dditem& item )
{

	item["sn_msgsubject"].from_string( subject );
	
	dditem& block = item["sn_msgentry"];	
	block.clear_value();
	ddstring result;
	for( size_t i=0; i<entries.size(); ++i )
	{
		block["id"].from_string( entries[i] );
		block["sn_msgsubject"].from_string( subjects[i] );
		// aktivn link rot rendern
		block["id_activ"].from_string( id == entries[i] ? "class='active'" : "" );
		result += block.to_string();
	}
	block.from_string( result );
	
	return item.to_string();

}


/**
	Ein Dossier in die entpsrechende Box rendern.
*/

void ddwebdossier::render_dossier_editor( const ddstring& id, dditem& item )
{
	item.clear_value();
	item.clear_children();
	ddstring result;
	
	
	if( !entries.size() ) 
	{
		item.from_string(  DDHINTNOTFOUND );
		return;	
	}
	
	for( size_t i=0; i<entries.size(); ++i )
	{
		
		item["id_main1"].from_string( id );
		item["id_main2"].from_string( id );
		item["id_main3"].from_string( id );
		//item["id_main4"].from_string( id );

		item["id1"].from_string( entries[i] );
		item["id2"].from_string( entries[i] );
		item["id3"].from_string( entries[i] );
		item["id4"].from_string( entries[i] );
		item["sn_msgsubject"].from_string( subjects[i] );
		// aktivn link rot rendern
		//item["id_activ"].from_string( id == entries[i] ? "class='active'" : "" );
		result += item.to_string();
	}
	item.from_string( result );

}
