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

    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 <ddwebview.h>
#include <ddwebpage.h>
#include <ddwebsite.h>
#include <ddstringset.h>




/**
	Default Constructor.
*/

ddwebview::ddwebview()
{	
	
}


/**
	Standard Constructor.
*/

ddwebview::ddwebview( const ddstring& name )
:	dddatatable<dddataobject <ddwebview> >( name )
{
	
}


/**
	Destructor.
*/

ddwebview::~ddwebview()
{
	
}


/**
	Einen Eintrag (Zeile) erzeugen, gehört eigentlich in die 
	Basisklasse, aber das frisst der Compiler nicht.
*/

void ddwebview::add_entry( size_t num_fields, MYSQL_ROW row )
{
	// tmp object bauen, reinkopieren
	size_t idx = add( dddataobject<ddwebview>( this ) );
	// rausholen
	dddataobject<ddwebview>& newobj = (*this)[idx];
	//FIX! PFUSCH!!
	for( size_t i=0; i < num_fields; i++)
		newobj.add( row[i] ? row[i] : "" );		
	
	// 'id'	speichern für index_of
	if( newobj.contains_key( "id" ) )
		this->_index[ newobj["id"] ] = idx;
	
	// den object state setzen
	// FIX! das müsste eigentlich das object irgenwie selbermachen...
	if( newobj.contains_key( "id_state" ) )
		newobj.set_state_flags( newobj["id_state"].as_size_t() );
}


/**
	CGI-Daten mit Hilfe des Renderers in ein Item
	schreiben. Dazu muss eine temporäre Tabellen-Zeile
	erzeugt werden.
*/

dd_result ddwebview::on_render_cgi( ddwebpage& pagelet, dditem& target )
{
	clear();
	ddwebcgi& cgi = pagelet.get_cgi();
	
	ddwebcgi::const_iterator pos = cgi.begin();
	size_t x = 0;
	// die Zeile...
	// tmp object bauen, reinkopieren
	size_t idx = add( dddataobject<ddwebview>( this ) );
	// rausholen
	dddataobject<ddwebview>& newobj = (*this)[idx];

	for( ; pos != cgi.end(); ++pos )
	{
		// key ...
		add_field_key( ddstring( (*pos).first ), x++ );		
		// value...
		newobj.add( (*pos).second );		
		
	}
	
	// nötig??
	// 'id'	speichern für index_of
	if( newobj.contains_key( "id" ) )
		this->_index[ newobj["id"] ] = idx;
	
	// den object state setzen
	// FIX! das müsste eigentlich das object irgenwie selbermachen...
	if( newobj.contains_key( "id_state" ) )
		newobj.set_state_flags( newobj["id_state"].as_size_t() );
		
	// ...renderer resetten...
	_renderer.clear_result();
	_renderer.clear_entries();
	
	// ... dann die erste zeile rendern ...
	_renderer.render_entry( pagelet, target, _data[0], 0 );
	//target.from_string( _renderer.get_result() );
	
	return rs_ok;
	
}


/**
	Eine Tabellen-Zeile mit Hilfe des Renderers in ein Item
	schreiben.
*/

int ddwebview::read( ddwebpage& pagelet, dditem& item )
{	
	
	// FIX! Das lädt die Tabelle neu und ruiniert damit
	// cache-daten. .

	//??
	validate();
	// tabelle normal einlesen ...
	if( dddatastore::read() <= 0 )
		log_fatal( "ddwebview::read( ddwebpage& pagelet, dditem& item ): Kein Eintrag!" );
	
	// ... aufräumen ...
	// warum ist das auskommentiert?
	//get_next_result();
	
	// ...renderer resetten...
	_renderer.clear_result();
	_renderer.clear_entries();
	
	// ... dann die erste zeile rendern ...
	_renderer.render_entry( pagelet, item, _data[0], 0 );
	
	//return get_affected_rows();

	return 1;

}


	
/**
	Die ID des nächsten bzw. letzten Eintrags rausfinden.
*/

ddstring ddwebview::get_neighbor_entry_id( const ddstring& id, bool get_last )
{
	// eintrag holen
	int idx = index_of( id );
	if( idx < 0 )
		return "";
	
	// ab hier: eintrag gibts
	
	// idx+1
	if( get_last )
	{
		while( ++idx < size() )
			if( !(*this)[ idx ].is_removed() )
				return (*this)[ idx ]["id"]; 
	}
	else
	{
		while( --idx > -1 )
			if( !(*this)[ idx ].is_removed() )
				return (*this)[ idx ]["id"]; 	
	}
				
	return "";
	
}
	
	
/**
	Ein Flag setzen
*/

void ddwebview::set_child_flag( const ddstring& id, int flag  )
{
	int idx = index_of( id );
	if( idx > -1  )
		(*this)[ idx ].set_flag( flag );
}	


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

    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.

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


/**
	Standard Constructor.
*/

ddwebviewmap::ddwebviewmap()
{

}


/**
	Destructor.
*/

ddwebviewmap::~ddwebviewmap()
{

}
	

/**
	Tabellen einlesen.
*/

void ddwebviewmap::init_tables( ddconfig& config )
{
	// setup virtual tables	
	for( int i=0; i<config.size(); ++i )
	{
		// these tables are private property of a pagelet.
		if( config[i].get_type() != "table" )
			continue;
		// setup data table
		add_table( config, config[i] );
	}
}


/**
	Tabelle erzeugen und ggf. connecten.
*/

void ddwebviewmap::add_table( ddconfig& config, ddconfigsection& section )
{
	
	const ddstring& pagekey = section.get_name();  
	ddwebview* table = new ddwebview( pagekey );
	
	// rausfinden, ob geerbt wird.
	if( section.contains_key( "extends" ) )
	{
		const dddataquerymap& queries = get_entry( section["extends"] ).get_queries();		
		for( int i=0; i<queries.size(); ++i )
			table->add_query( queries[i]->get_name(), queries[i]->get_raw_query_string() );
	}
	
	// rausfinden, ob eine abhängigkeitsbeziehung besteht.
	if( section.contains_key( "child_of" ) )
		get_entry( section["child_of"] ).add_child( table );
	
	table->init_queries( section );
	
	// den renderer auch initialisieren
	table->get_renderer().init_tag_blocks( config );
	
	// FIX! das verheizt connections!
	// die globalen tables schon mal connecten ...
	if( pagekey.contains( "site." ) )
		table->connect( config["main"]["connectstring"] );
	
	add_by_key( pagekey, table );	

}

