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

    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 <dditemsysval.h>
#include <dditemset.h>
#include <ddiourl.h>
#include <ddwebpage.h>
#include <dduserid.h>
#include <ddbasetime.h>
#include <ddusermanager.h>
#include <ddwebsite.h>
#include <ddwebserver.h>



/**
	Constructor.
*/

dditemsysval::dditemsysval()
: _mode( 0 )
{

}


/**
	Standard constructor.
	@param name the name of this item.
*/

dditemsysval::dditemsysval( const ddstring& name )
:	dditem( name ), _mode( 0 )
{

}


/**
	Standard constructor.
	@param mode the mode of this item.
*/

dditemsysval::dditemsysval( size_t mode )
:	_mode( mode )
{

}


/**
	Standard constructor.
	@param name the name of this item.
	@param value the value of this item.
	...
*/

dditemsysval::dditemsysval( const ddstring& name, const ddstring& value, const ddstring& call, size_t access, size_t mode )
:	dditem( name, value, call, access ), _mode( mode )
{

}



/**
	Destructor.
*/

dditemsysval::~dditemsysval()
{

}


/**
	Set the call function or value.
*/

void dditemsysval::set_param( const ddstring& param )
{
	_param = param;
  // ugly, FIX, kann man da eine statische map draus machen?
  if( _param == "date" )
 		_mode = dditemsysval::sysval_date;
  else if( _param == "time" )
		_mode = dditemsysval::sysval_time;
  else if( _param == "datetime" )
		_mode = dditemsysval::sysval_datetime;
  else if( _param == "users" )
		_mode = dditemsysval::sysval_users;
  else if( _param == "members" )	
		_mode = dditemsysval::sysval_members;		
	else if( _param == "guestnick" )	
		_mode = dditemsysval::sysval_guestnick;
 	else if( _param == "nickname" )
		_mode = dditemsysval::sysval_nickname;
  else if( _param == "nickmail" )
		_mode = dditemsysval::sysval_nickmail;
	else if( _param == "version" )
		_mode = dditemsysval::sysval_version;
	else if( _param == "uid" )
		_mode = dditemsysval::sysval_uid;
	else if( _param == "spacer" )
		_mode = dditemsysval::sysval_spacer;
	else if( _param == "starttime" )
		_mode = dditemsysval::sysval_starttime;
	else if( _param == "referer" )
		_mode = dditemsysval::sysval_referer;
	else if( _param == "pagetitle" )
		_mode = dditemsysval::sysval_pagetitle;
	else if( _param == "pagetype" )
		_mode = dditemsysval::sysval_pagetype;
	else if( _param == "acceptterms" )
		_mode = dditemsysval::sysval_acceptterms;
	else if( _param == "mailalert" )
		_mode = dditemsysval::sysval_mailalert;
	else if( _param == "masterdomain" )
		_mode = dditemsysval::sysval_masterdomain;
	else if( _param == "memberscore" )
		_mode = dditemsysval::sysval_memberscore;
	else if( _param == "pagelocation" )
		_mode = dditemsysval::sysval_pageloction;
	else if( _param == "groupid" )
		_mode = dditemsysval::sysval_groupid;
	else if( _param == "groupname" )
		_mode = dditemsysval::sysval_groupname;
	else if( _param == "groupkeys" )
		_mode = dditemsysval::sysval_groupkeys;
	else if( _param == "groupdescription" )
		_mode = dditemsysval::sysval_groupdescription;
	else if( _param == "groupicon" )
		_mode = dditemsysval::sysval_groupicon;	
	else if( _param == "groupiconbig" )
		_mode = dditemsysval::sysval_groupiconbig;	
	else if( _param == "entryid" )
		_mode = dditemsysval::sysval_entryid;	
	else if( _param == "subject" )
		_mode = dditemsysval::sysval_subject;	
	else if( _param == "domain" )
		_mode = dditemsysval::sysval_domain;
	else if( _param == "breadcrump" )
		_mode = dditemsysval::sysval_breadcrump;
	else if( _param == "navipage" )
		_mode = dditemsysval::sysval_navipage;
	else if( _param == "jumplast" )
		_mode = dditemsysval::sysval_jumplast;
	else if( _param == "vgwort" )
		_mode = dditemsysval::sysval_vgwort;
	else if( _param == "imageid" )
		_mode = dditemsysval::sysval_imageid;
	else if( _param == "imagepath" )
		_mode = dditemsysval::sysval_imagepath;
		
		
}


/**
	Anhand des mode-flags wird der inhalt von
	'_value' gesetzt.
*/

void	dditemsysval::create_value_content( ddwebpage& pagelet )
{
  // check accessrights
  //??
  //if( !( get_access() & pagelet.get_user_id().get_access_rights() ) )
	//	return 1;

  // create content depending on mode

  // ok, das ist redundant: die werte werden 
  // nach _value kopiert und dann erst in den buffer geschrieben.
  
  switch( _mode )
  {
		    
		case dditemsysval::sysval_time :
			
			_value = ddbasetime::now().to_string();
			break;

		case dditemsysval::sysval_date :
	  	
			// 17.12.1969
			_value = ddbasedate::now().to_string( "%d.%m.%Y" );
			break;

		// 17.12.1969, 15:34
		case dditemsysval::sysval_datetime :

			_value = ddbasedate::now().to_string( "%d.%m.%Y, %R");
			break;

    case dditemsysval::sysval_users :

 			_value.from_int( pagelet.get_session_manager().session_count() );
			break;

    case dditemsysval::sysval_members :

 			_value.from_int( pagelet.get_user_manager().size() );
			break;
			    	
			
		case dditemsysval::sysval_guestnick :
    
    	//  hack
			if( pagelet.get_user_id().is_member() )
				_value = "<a href='/member/" + pagelet.get_user_id().get_id() + "'>" + pagelet.get_user_id().get_nick_name() + "</a>";
			else
				_value = pagelet.get_user_id().get_nick_name();
			break;
				
		case dditemsysval::sysval_nickname :
			
			// ??
			// nur setzen, wenn noch nicht gesetzt
			_value = _value == DDGUESTNICK ? "" : pagelet.get_user_id().get_nick_name();
			break;

 		case dditemsysval::sysval_nickmail :

			// ?? seiteneffekte??
			// nur setzen, wenn noch nicht gesetzt
			//if( _value == "" )
			//if( pagelet.get_user_id().is_member() )
			_value = pagelet.get_user_id().get_nick_mail();	 
			break;
		
		case dditemsysval::sysval_version :

			_value = DDVERSION;
			break;
  
		case dditemsysval::sysval_uid :

			_value = pagelet.get_user_id().get_id();
			break;
		
		case dditemsysval::sysval_spacer :

			_value = "<br>";
			break;
		
		case dditemsysval::sysval_starttime :

			_value = pagelet.get_site().get_server().get_start_time();
			break;	
			
		case dditemsysval::sysval_referer :

			// YEAH YEAH YEAH: Kultiger Mörderhack: der gesamte referer-request
			// wird escaped und in ein cgi-feld geklemmt.
			
			// FIX zusammenbauen aus raw_path und cgi _path
			// NEIN DAS IST WAS ANDERES weil hier auch ? & escaped werden.
			// überprüfen!
			
			_value = pagelet.get_connection().get_request().get_raw_path_escaped();
			break;	
			
		case dditemsysval::sysval_pagetitle : 
			
			_value = pagelet.context.pagetitle;
			break;	
			
		case dditemsysval::sysval_pagetype :
		
			if( !pagelet.context.pagetype.empty() )				
				_value = pagelet.context.pagetype;
			break;	
			
		case dditemsysval::sysval_acceptterms :
		
			_value = pagelet.get_user_id().get_accepting_terms_flag() ? "checked" : "" ;
			break;	

		case dditemsysval::sysval_mailalert :
		
			_value = pagelet.get_user_id().get_mail_alert_flag() ? "checked" : "" ;
			break;
			
		case dditemsysval::sysval_masterdomain :
		
			_value = pagelet.get_site().get_master_domain();
			break;
			
		case dditemsysval::sysval_memberscore : 
		
			_value.from_size_t( pagelet.get_user_id().get_rank_score() );
			break;		
		
		case dditemsysval::sysval_pageloction : 
		
			// die location ist der fullpath ohne schnickschnack
			_value = pagelet.get_full_path();			
			if( _value[ _value.size() - 1 ] == '/' )
				_value.resize( _value.size() - 1 );
			break;		

		case dditemsysval::sysval_groupid : 
		
			_value = pagelet.context.idgrp;
			break;		

		case dditemsysval::sysval_groupname : 
		
			_value = pagelet.get_groups()[pagelet.context.idgrp].get_name();
			break;		

		case dditemsysval::sysval_groupkeys : 
		
			_value = pagelet.get_groups()[pagelet.context.idgrp].get_keys();
			break;		

		case dditemsysval::sysval_groupdescription : 
		
			_value = pagelet.get_groups()[pagelet.context.idgrp].get_description();
			break;		
			
		
		case dditemsysval::sysval_groupicon : 
		
			_value =  pagelet.get_groups()[pagelet.context.idgrp].get_icon_big();
			break;		
		
		case dditemsysval::sysval_groupiconbig : 
		
			_value =  pagelet.get_groups()[pagelet.context.idgrp].get_icon_big();
			break;		
		
		case dditemsysval::sysval_entryid : 
		
			_value = pagelet.context.id;
			break;		
  
		case dditemsysval::sysval_subject : 
		
			_value = pagelet.context.subject;
			break;		

		case dditemsysval::sysval_domain : 
		
			_value = pagelet.get_site().get_name();
			if( _value == "computer" )
				_value = "www";
			break;		
			
	case dditemsysval::sysval_breadcrump : 
		
			_value = "(--breadcrump--)";//pagelet.context.breadcrump;
			break;		
			
	case dditemsysval::sysval_navipage : 
		
			// "Seite 1" nicht anzeigen, da das sonst überall steht
			// und auch in den servicelinks nix anzeigen
			
			if( pagelet.context.navipage && ( pagelet.get_cgi().empty() || pagelet.get_cgi().contains_key( "page" ) ) )
				_value = "Seite " + ddstrutil::from_size_t( pagelet.context.navipage + 1 ) + " ";
			else
				_value = "";
			break;		

	case dditemsysval::sysval_jumplast : 
		
			_value = pagelet.get_jump_last_url();
			//_value = "";
			break;		
  
  case dditemsysval::sysval_vgwort : 
		
			_value = pagelet.get_vg_wort_tag();
			break;		
  
  case dditemsysval::sysval_imageid : 
		
			// falls schon mit einträgen hantiert wurde, sollte das hier 
			// automatisch belegt sein
			_value = pagelet.get_user_id().get_property( DDENTRYID );
			// muss '0' wg. pfad da sonst: /xx//moo.jpg
			if( _value.empty() )
				_value = "0";
		
			break;		
  
  case dditemsysval::sysval_imagepath : 
			
			_value = pagelet.get_image_path();
			if( ( pagelet.get_split_path()[0] != "member" ) )
			{
				if( pagelet.get_user_id().get_property( DDENTRYID ).empty() )
					_value += "0";
				else
					_value += pagelet.get_user_id().get_property( DDENTRYID );
			}
			break;		
  
  }


}



/**
	Inhalt in den pagelet-buffer schreiben.
	@see create_value_content()
*/

dd_result dditemsysval::flush_content( ddwebpage& pagelet )
{	
	create_value_content( pagelet );
	pagelet.get_buffer().append( to_string() );
  return rs_ok;

}


/**
	Inhalt in einen string schreiben.
	@see create_value_content()
*/

dd_result dditemsysval::flush_content( ddwebpage& pagelet, ddstring& target )
{
	create_value_content( pagelet );
	target.append( to_string() );
  return rs_ok;
}


/**
	Einen Clon erzeugen
*/

dditem* dditemsysval::clone() const
{
  return new dditemsysval( _name, _value, _param, _access, _mode );
}


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

    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.

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


/**
	Constructor.
*/

dditemselect::dditemselect()
{

}


/**
	Standard constructor.
	@param name the name of this item.
*/

dditemselect::dditemselect( const ddstring& name )
:	dditem( name )
{

}


/**
	Standard constructor.
	@param name the name of this item.
	@param value the value of this item.
	...
*/

dditemselect::dditemselect( const ddstring& name, const ddstring& value, const ddstring& call, size_t access )
:	dditem( name, value, call, access )
{

}



/**
	Destructor.
*/

dditemselect::~dditemselect()
{

}


/**
	Inhalt in den pagelet-buffer schreiben.
	@see create_value_content()
*/

dd_result dditemselect::flush_content( ddwebpage& pagelet )
{
	bool is_admin = pagelet.get_user_id().is_admin();
	ddstring result = pagelet.get_groups().create_group_selector( _value , is_admin );
	pagelet.get_buffer().append( result );
  return rs_ok;
}


/**
	Inhalt in einen string schreiben.
	@see create_value_content()
*/

dd_result dditemselect::flush_content( ddwebpage& pagelet, ddstring& target )
{
	bool is_admin = pagelet.get_user_id().is_admin();
	ddstring result = pagelet.get_groups().create_group_selector( _value , is_admin );
	target.append( result );
  return rs_ok;
}


/**
	Einen Clon erzeugen
*/

dditem* dditemselect::clone() const
{
  return new dditemselect( _name, _value, _param, _access );
}

