#!/usr/bin/perl
# ----------------------------------------------------------------------------
#
#  (c) Copyright 2006 TradeExtender
# 
#  This software is proprietary to  embodies the confidential technology 
#  of TradeExtender. Possession, use, duplication or dissemination of the 
#  software and media is authorized only pursuant to a valid written license 
#  from TradeExtender.
#

use strict;
use lib "/var/www/vhosts/kantelpunten.com/httpdocs/pl/lib";
use lib "lib";
BEGIN {
    delete $INC{"Kantelpunten/Helper.pm"};
    delete $INC{"Kantelpunten/Process.pm"};
#    delete $INC{"Kantelpunten/MyRobots.pm"};
    delete $INC{"Kantelpunten/MyBudy.pm"};
    delete $INC{"Kantelpunten/MyAdds.pm"};
}
use Kantelpunten::Helper;
use Kantelpunten::Process;
use Kantelpunten::MyRobots;
use Kantelpunten::MyBudy;
use Kantelpunten::MyAdds;
use POSIX qw(strftime);
use Data::Dumper;

use constant MAX_COLUMN	=> 11;

local our $stocks;
local our $data;
local our $param;
local our $page;
local our $total_ok   = 0;
local our $total_nok  = 0;
local our $total_perc = 0;
local our $prev_state = "";
local our $add_count  = 0;
local our $add_status = 0;
local our $added_rows = 0;
local our $header = undef;

show_kantel_overview();
exit(0);

sub show_kantel_overview()
{
	my $q = CGI->new;

	$param->{success}	= defined($q->param('success')) ? 1 : undef;
	$param->{correct}	= defined($q->param('correct')) ? 1 : undef;
	$param->{debug}	    = defined($q->param('debug')) ? 1 : undef;
	$param->{sort} 		= 1;
	$param->{trigger}	= defined($q->param('trigger')) ? 1 : undef;
	$param->{mail}		= defined($q->param('mail')) ? 1 : undef;
	$param->{all}		= defined($q->param('all')) ? 1 : undef;
	$param->{mine}		= defined($q->param('mine')) ? 1 : undef;
	$param->{open}		= defined($q->param('open')) ? 1 : undef;
	$param->{scan}		= defined($q->param('scan')) ? 1 : undef;
	$param->{type} 		= $q->param('type');
	$param->{reverse} 	= $q->param('reverse');
	$param->{column} 	= $q->param('column');
	$param->{market}    = $q->param('market');
	$param->{perc}      = 1.82;
	$param->{redirect}	= defined($q->param('redirect')) ? 1 : undef;
	
	my $remote_ip = init_helper();
	init_process();

	$total_ok   = 0;
	$total_nok  = 0;
	$total_perc = 0;
	$prev_state = "";
	$add_count  = 0;
	$add_status = 0;
	$added_rows = 0;

	get_user_rec();
	$param->{budy} = init_budy($q->param('uitleg'));
	
	$param->{scan} = undef if (!is_admin_user());
	
	if (0 && (defined(only_allowed_for_admin_users("test")) || (is_super_user() && !is_admin_user())))
	{
		print_header();
		print_pre_doc();
		print_head("Onder ontwikkeling", undef, undef, undef, undef, "info");
		print_body("info");
		print_div("center");
		print add_under_construction();
		print_voet();
		print_div("end");
		print_body("end");
		print_post_doc();
		exit(0);
	}
	
	# check for a market change
	my $market = set_market();
	# oops I'v to add bel if no enabled anymore
	if (defined($market) && ($market & (1 << get_market_bit('bel20'))) && !($market & (1 << get_market_bit('bel'))))
	{
		$market |= (1 << get_market_bit('bel'));
	}
	if (defined($param->{market}) && defined($market))
	{
		$param->{market} = 0xff if (($param->{market} & 0x7f) == 0);
		if ($param->{market} != $market)
		{
			set_market($param->{market});
			write_user_rec();
		}
		$market = $param->{market};
	}
	$market = 0xff if (!defined($market));

	# translate old type into the new method
	if (defined($param->{type}))
	{
		$param->{success} = 1 if ($param->{type} eq "success");
		$param->{correct} = 1 if ($param->{type} eq "correct");
		$param->{all}     = 1 if (($param->{type} eq "alle") || ($param->{type} eq "open"));
		$param->{mine}    = 1 if ($param->{type} eq "eigen");
		$param->{open}    = 1 if ($param->{type} eq "open");
		$param->{type} = undef;
	}

	# fix wrongly selected items
	if (!is_admin_user())
	{
		$param->{trigger} = undef;
		$param->{debug} = undef;
	}
	$param->{all} = undef if (defined($param->{all}) && defined($param->{mine}));
	$param->{reverse} = undef if (defined($param->{reverse}) && ($param->{reverse} != 0) && ($param->{reverse} != 1));
	$param->{column} = undef if (defined($param->{column}) && (($param->{column} < 0) || ($param->{column} > MAX_COLUMN)));
	$param->{sort} = 0 if (defined($param->{success}));
	# disable if no sort
	$param->{column} = undef if (!$param->{sort});
	$param->{reverse} = undef if (!$param->{sort});

	# first check if we have to disable some current info  
	my $cinfo = get_kantel_cookie();
	$cinfo &= 0xfffd if (defined($param->{all}));
	$cinfo &= 0xfffe if (defined($param->{mine}));
#	$cinfo &= 0xfff7 if (defined($param->{recent}));
	$cinfo &= 0xfffb if (defined($param->{open}));
	$cinfo &= 0xffef if (defined($param->{reverse}));
	$cinfo &= 0xfe1f if (defined($param->{column}));

	# now make the new info 
	my $info = 0;
	$info |= 0x0001 if (defined($param->{all}));
	$info |= 0x0002 if (defined($param->{mine}));
#	$info |= 0x0004 if (defined($param->{recent}));
	$info |= 0x0008 if (defined($param->{open}));
	$info |= 0x0010 if (defined($param->{reverse}) && ($param->{reverse} == 1));
	$info |= ($param->{column} << 5) if (defined($param->{column}));
	$info |= $cinfo;
	add_kantel_cookie($info) if ($cinfo != $info);

	# now make the new values using the new info
	$param->{all}      = ($info & 0x0001) ? 1 : undef;
	$param->{mine}     = ($info & 0x0002) ? 1 : undef;
#	$param->{recent}   = ($info & 0x0004) ? 1 : undef;
	$param->{open}     = ($info & 0x0008) ? 1 : undef;
	$param->{reverse}  = ($info & 0x0010) ? 1 : 0;
	$param->{column}   = ($info & 0x03e0) >> 5;

	# finaly set the default if not selected yet
	$param->{all}    = 1 if (!defined($param->{all}) && !defined($param->{mine}));    	# default is all
	$param->{open}   = 1 if (!defined($param->{success}) && !defined($param->{correct}));

	# disable again if it was set by a cookie
	$param->{column} = 0 if (!$param->{sort});
	$param->{reverse} = 0 if (!$param->{sort});

	# make sure values are disabled if not needed for this type
	if (defined($param->{success}) || defined($param->{correct}))
	{
		$param->{all}    = undef;
		$param->{mine}   = undef;
		$param->{open}   = undef;
		$param->{column} = 0 if (defined($param->{correct}) && ($param->{column} != 1) && ($param->{column} != 2) && ($param->{column} != 7) && ($param->{column} != 9) && ($param->{column} != 11));
		$param->{column} = 0 if (defined($param->{success}) && (($param->{column} == 3) || ($param->{column} == 5) || ($param->{column} == 6) || ($param->{column} == 10) || ($param->{column} == 11)));
	}
	else
	{
		$param->{column} = 0 if (($param->{column} == 3) || ($param->{column} == 5) || ($param->{column} == 7) || ($param->{column} == 8) || ($param->{column} == 10) || ($param->{column} == 11));
	}
	
	# change default into correct column
	$param->{column} = 7 if (($param->{column} == 0) && defined($param->{correct}));
	$param->{column} = 7 if (($param->{column} == 0) && defined($param->{success}));
	$param->{column} = 6 if (($param->{column} == 0) && defined($param->{open}));
	$param->{column} = 1 if ($param->{column} == 0);

	$page = undef;
	$page = 9986 if (defined($param->{success}));
	$page = 9985 if (defined($param->{correct}));
	if (!defined($page))
	{
		$page = 9988 if (defined($param->{mine}) && defined($param->{open}));
		$page = 9987 if (defined($param->{all}) && defined($param->{open}));
		$page = 9981 if (defined($page) && $page == 9987 && defined($param->{redirect}));
	}
	$param->{kantelpunt} = (!is_trial_user() && (is_logged_in() || is_trial_period())) ? 1 : undef;
	$param->{kantelpunt} = undef if (defined($param->{success}) || defined($param->{correct}));
	$param->{kantelpunt} = undef;
	
	if (!defined($page))
	{
    	print_error_doc("Gekozen advies overview $param->{type} wordt niet ondersteund.");
	    exit(0);
	}

	if (defined($param->{mail}))
	{
		if (defined($param->{rb}) && $param->{rb})
		{
			# no send mail if identified as robot
			log_problem("show_kantel_overview: Send mail requested by robot?");
			exit(0);
		}
		if (($page != 9989) && ($page != 9987))
		{
			$param->{mail} = undef;
		}
	}
	$param->{mail} = undef;

	$param->{regi} = 1 if (defined($param->{open}) && (is_trial_user() || !is_logged_in()) );
	$param->{regi} = undef if (is_trial_period());
	only_allowed_for_registered_users() if (defined($param->{mine}));

	$market = 0xff if (defined($param->{success}));		# winstpakker tonen altijd alles
	if (defined($param->{mine}))
	{
		$stocks = get_stocks_mine();
	}
	else
	{
		$stocks = get_stocks_market($market);
		if (!defined($stocks))
		{
    		print_error_doc("SKO: Probleem met het lezen van de aandelen data.");
    		exit(0);
		}
	}

	$data = read_all_quote_data();
	if (!defined($data))
	{
    	print_error_doc("Probleem met het lezen van de advies data.");
    	exit(0);
	}

	add_last_page_cookie($page) if (!defined($param->{mail}));
	write_access_data($remote_ip, $page) if (!defined($param->{mail}));

	make_kantelpunten_overview_html($market) if (!defined($param->{mail}));
#	send_kantelpunten_overview() if (defined($param->{mail}));
}
    
sub print_market_table(@)
{
	my ($dummy) = @_;
	
	my $market = set_market();
	return 0 if (!defined($market));
	return 0 if (defined($param->{success}));
	return 0 if (defined($param->{mine}));

	my $iref;
	my $tref;
    my $ref = "ShowKantelOverview.pl";
    $ref .= "?type=success" if (defined($param->{success}));
    $ref .= "?type=correct" if (defined($param->{correct}));
    $ref .= "?open=1" if (defined($param->{open}));
    $ref .= "&mine=1" if (defined($param->{mine}));
    $iref = $ref;
    $iref .= "&column=$param->{column}&reverse=$param->{reverse}" if ($param->{sort});
    # option table
    print_div("right");   
    print_table(0, undef, 0, 0, 0, undef, "", "right", "font-size: 11px;");
    print "<tr>\n";
    
    $tref = $iref;
    $tref .= "&market=" . ($market | make_market("aex", "amx", "overig")) if (!is_nl_enabled($market));
    $tref .= "&market=" . ($market & make_market("bel20", "bel")) if (is_nl_enabled($market));
    print "<td>\n";
    print_midi_button($tref, is_nl_enabled($market) ? "nl" : "no_nl");
    print "</td>\n";
    print "<td>&nbsp;&nbsp;</td>\n";

    $tref = $iref;
    $tref .= "&market=" . ($market | make_market ("bel20", "bel")) if (!is_be_enabled($market));
    $tref .= "&market=" . ($market & make_market ("aex", "amx", "overig")) if (is_be_enabled($market));
    print "<td>\n";
    print_midi_button($tref, is_be_enabled($market) ? "be" : "no_be");
	print "</td>\n";
	
   	print "<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n";
    print "</tr>\n";
    print_table(0, "end");
    print_div("end");
    
    return 1;
}	

sub get_status(@)
{
	my ($data, $head) = @_;
	
	if (defined($param->{success}))
	{
		return "Niet&nbsp;gevolgd" if (!$data->{follow});
		return "Uit&nbsp;de&nbsp;markt" if ($data->{state} == 0);
		return "Wacht&nbsp;trigger" if ($data->{state} == 1);
		return "Ingetrokken" if (($data->{state} >= 2) && ($data->{state} <= 6));
		return "In&nbsp;de&nbsp;markt" if (($data->{state} >= 7) && ($data->{state} <= 11));
		return "Verkocht" if ($data->{state} == 12);
		return "Onbekend";
	}
	elsif (defined($param->{open}))
	{
		if (!defined($head))
		{
			return translate_kantel_state($data->{state}, 2);
		}
		else
		{
			if ($data->{state} == 1)
			{
				my $state;
				my $ret;
				if (is_news_flash($data->{last_news}))
				{
					$state = "Deze aandelen hebben een koopsignaal + nieuws.";
				}
				else
				{
					$state = translate_kantel_state($data->{state}, 3);
				}
				$ret  = "<small><small>Advies met bedrijfsnieuws, heeft de voorkeur.<br></small></small>\n";
				$ret .= $state . "<br>\n";
				$ret .= "<small><small>Vermijdt cijfers / dividend / aandelenuitgiftes. Lees <a href=\"/pl/ShowMain.pl?page=20286\">hier</a> waarom.</small></small>\n"; 
				return $ret;
			}
			return translate_kantel_state($data->{state}, 3);
		}
	}
	return "Onbekend";
}

sub make_kantelpunten_overview_html(@)
{
	my ($market) = @_;
	my $script = ""; # make_script();
    $script .= make_home_script($page) if (!is_admin_user());
    
    my $title;
    my $desc;
    my $pop_menu;
    my $top_menu;
    if (defined($param->{success}))
    {
		$title = "Kantelpunten : Winstpakkers - Lopende succesvolle beleggingsadviezen.";
	 	$desc  = "Onze lijst met lopende adviezen. Zie hoeveel winst u had kunnen pakken vanaf" .
	 	" onze koop signalen. Vele procenten winst in slechts enkele dagen. Kort in de markt en" .
	 	" snel winstnemen is de weg voor een succevolle belegger. Alle beleggingstips op een rijtje.";
	    $pop_menu = make_pop_menu(12, $page);
	    $top_menu = make_top_menu(12, $page);
    }
    elsif (defined($param->{correct}))
	{
		$title = "Kantelpunten : Juistheid beleggingen - Netto winsten geen vage bruto cijfers.";
	 	$desc  = "Al onze adviezen rekenen we netto uit, dit omdat bij veelvuldig handelen de transactie" .
	 	" kosten een belangrijke rol spelen. We rekenen met €5000,- en 2 * €8,- per handeling. Met weinig" .
	 	" dagen in de markt kunt u toch hoge rendementen behalen. Geen vage begrippen alles is volledig" .
	 	" controleerbaar en dat zonder registratie.";
	    $pop_menu = make_pop_menu(12, $page);
	    $top_menu = make_top_menu(12, $page);
	}
    else
    {
		$title = "Kantelpunten : Overzicht beleggingsadviezen - Beleggen helder en eenvoudig te volgen.";
	 	$desc  = "Wij maken beleggen helder en eenvoudig. Deze lijst is een overzicht van all onze lopende" .
		" adviezen. We geven duidelijk aan waar u moet kopen en waneer u moet verkopen. Beleggen was nog nooit zo" .
	    " eenvoudig. Gratis inzicht in alle afgelopen handelingen.";
	    $pop_menu = make_pop_menu(defined($param->{mine}) ? 2 : 4, $page);
	    $top_menu = make_top_menu(defined($param->{mine}) ? 2 : 4, $page);
	}
			
    print_header("+1s");
    print_pre_doc();
    print_head($title, undef, undef, undef, $script, "kantelpunt",defined($param->{mine}) ? "eigen" : undef, undef, $desc, undef, "top_script");
    print_body(defined($param->{mine}) ? "eigen" : "kantel", undef, undef, undef, undef, undef, undef, "kader", undef, $pop_menu, $top_menu);
    print make_bb_popup();
    make_kantelpunten_overview($market);
    print_body("end_kader");
    print_post_doc();
}

sub send_kantelpunten_overview()
{
    # first we need to write the information to a file
    my $sesid = get_session_cookie();
    my $userid = get_userid_cookie();
    $sesid = 0 unless defined($sesid);
    $userid = 0 unless defined($userid);
    my $time = time();
    my $filename = "${userid}_${sesid}_${page}_${time}.html";
	my $file = get_public_dir() . "mail/$filename";
	
    if (open(TXT, ">$file"))
    {
	    make_kantelpunten_overview(0xff);
	    close TXT;
	}
	else
	{
    	print_error_doc("Probleem met het aanmaken van de pagina.");
    	exit(0);
	}
	print_re3("SendPage.pl?page=$page&time=$time");
}

sub get_kantelpunten_ids()
{
	my @ids;
    my @date_ids;
	my @int_ids;
	my $names;
	my $mkts;
    my $difs;
    my $days;
    my $type;
    my $state;
    my $cor;
    my $trigs;
    my $percs;
    my $t;
    my $num;
    my $perc;
    my $imkt;
    # first make a list with the ids what to adde depends on the type
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
    my $add_time = ($wday == 0) ? (72*3600) : (($wday == 6) ? (48*3600) : (33*3600));
    foreach my $i (keys %$data)
    {
        next if ($i == 0);
        next if (!defined($stocks->{$i}));
        if (defined($param->{success}))
        {
	        next if ($data->{$i}->{state} <= 1);	# never bought
	        next if ($param->{perc} && ($data->{$i}->{max_dif} < $param->{perc}));
#	        next if ($data->{$i}->{scan_time} != $data->{$i}->{kantel_time});
        }
        elsif (defined($param->{open}))
        {
            next if (!is_adviespunt($data->{$i}, $add_time));
#	        next if (!defined($param->{scan}) && !$data->{$i}->{follow});
#	        next if ($data->{$i}->{state} == 0);
#	        next if (($data->{$i}->{state} == 2) || ($data->{$i}->{state} == 3));
#	        next if (($data->{$i}->{state} >= 2) && ($data->{$i}->{state} <= 6) && ($data->{$i}->{scan_time} != $data->{$i}->{kantel_time}) && 
#	        		 (($data->{$i}->{scan_time} + (24*3600)) < time()) );
#	        next if (($data->{$i}->{state} >= 12) && (($data->{$i}->{sold_on} + $add_time) < time()));
        }
	    elsif (!defined($param->{correct}))
    	{
		    log_problem("get_kantelpunten_ids: No selection");
	    	last;
   		}
        $names->{$stocks->{$i}->{index_name}} = $i;
        $mkts->{$stocks->{$i}->{market}}++;
        push @int_ids, $i;
        
        $total_ok   += $data->{$i}->{num_ok};
        $total_nok  += $data->{$i}->{num_nok};
        $total_perc += $data->{$i}->{perc_gain};     
        
        if (defined($param->{correct}))
        {
	        $t = sprintf("%d%04d.%03d:%03d", ($data->{$i}->{max_perc} >= 0),
	        			int($data->{$i}->{max_perc})+100, (abs($data->{$i}->{max_perc})*1000)%1000, $i);
        }
        else
        {
	        $t = sprintf("%d%04d.%03d:%03d", ($data->{$i}->{max_dif} >= 0),
	        			int($data->{$i}->{max_dif})+100, (abs($data->{$i}->{max_dif})*1000)%1000, $i);
	    }
   	    $difs->{$t} = $i;

        $t = sprintf("%d%04d.%03d:%03d", ($data->{$i}->{perc_gain} >= 0),
        									int($data->{$i}->{perc_gain})+100, 
        									(abs($data->{$i}->{perc_gain})*1000)%1000, $i);
        $percs->{$t} = $i;

        $t = sprintf("%04d.%03d:%03d", int(abs($data->{$i}->{kantel_trigger})), (abs($data->{$i}->{kantel_trigger})*1000)%1000, $i);
        $trigs->{$t} = $i;

        $t = sprintf("%c:%03d", ord($data->{$i}->{scan_type}), $i);
        $type->{$t} = $i;
        
        $t = sprintf("%02d%d:%03d", $data->{$i}->{state}, 
        			($data->{$i}->{state} == 1) ? !is_news_flash($data->{$i}->{last_news}) : 1, $i);
        $state->{$t} = $i;

        $t = ($data->{$i}->{perc_gain} < -900) ? sprintf("%03d:%03d", 0, $i) : sprintf("%03d:%03d", $data->{$i}->{num_days}, $i);
        $imkt->{$t} = $i;

        $num = $data->{$i}->{num_ok} + $data->{$i}->{num_nok};
    	$num = 1 if ($num == 0);
    	$perc = $data->{$i}->{num_ok} / $num * 100;
        $t = sprintf("%03d.%03d:%03d", int($perc), ($perc*1000)%1000, $i);
        $cor->{$t} = $i;

        $num = int(($data->{$i}->{max_date}-$data->{$i}->{bought_on})/(24*3600));
		$num++;
    	$num = 0 if ($num < 0);
    	$data->{$i}->{max_days} = $num;
        $t = sprintf("%03d:%03d", $num, $i);
        $days->{$t} = $i;
    }

    my @sort;
	# 0 = default, 1 = name, 2 = markt, 3 = date, 4 = trend, 5 = trigger, 6 = state, 7 = max, 
	# 8 = dagen, 9 = juistheid, 10 =winst, 11 = inmarkt 
    if ($param->{column} == 2)	# sort on market
    {
    	@sort = ($param->{reverse} == 0) ? (sort keys %$mkts) : (reverse sort keys %$mkts); 
	   	my @name_idx = (sort keys %$names);
	    foreach my $j (@sort)
	    {
		    foreach my $i (@name_idx)
		    {
			    next if ($stocks->{$names->{$i}}->{market} ne $j);
	           	push @ids, $names->{$i};
           	}
	    }
    }
    elsif ($param->{column} == 3)	# sort on date
    {
        my %seen = ();
        foreach my $item (@date_ids) {
            $seen{$item}++;
        }
        @sort = ($param->{reverse} == 0) ? (reverse sort keys %seen) : (sort keys %seen);
        foreach my $date (@sort)
   	    {
       	    foreach my $i (@int_ids)
           	{
               	next if ($date != $data->{$i}->{kantel_time});
                push @ids, $i;
   	        }
       	}
    }
    elsif ($param->{column} == 4)	# sort on trend
    {
	    @sort = ($param->{reverse} == 0) ? (sort keys %$type) : (reverse sort keys %$type);
	    foreach my $i (@sort)
       	{
           	push @ids, $type->{$i};
       	}
    }
    elsif ($param->{column} == 5) 	# sort on trigger
    {
	    @sort = ($param->{reverse} == 0) ? (reverse sort keys %$trigs) : (sort keys %$trigs);
	    foreach my $i (@sort)
       	{
           	push @ids, $trigs->{$i};
       	}
    }
    elsif ($param->{column} == 6) 	# sort on state
    {
	    @sort = ($param->{reverse} == 0) ? (sort keys %$state) : (reverse sort keys %$state);
	    foreach my $i (@sort)
       	{
           	push @ids, $state->{$i};
       	}
    }
    elsif ($param->{column} == 7) 	# sort on max
    {
	    @sort = ($param->{reverse} == 0) ? (reverse sort keys %$difs) : (sort keys %$difs);
	    foreach my $i (@sort)
       	{
           	push @ids, $difs->{$i};
       	}
    }
    elsif ($param->{column} == 8)	# sort on dagen
    {
	    @sort = ($param->{reverse} == 0) ? (reverse sort keys %$days) : (sort keys %$days);
	   	foreach my $i (@sort)
       	{
           	push @ids, $days->{$i};
       	}
    }
    elsif ($param->{column} == 9)	# sort on juistheid
    {
    	@sort = ($param->{reverse} == 0) ? (reverse sort keys %$cor) : (sort keys %$cor); 
    	foreach my $i (@sort)
       	{
           	push @ids, $cor->{$i};
       	}
    }
    elsif ($param->{column} == 10) 	# sort on winst
    {
	    @sort = ($param->{reverse} == 0) ? (reverse sort keys %$percs) : (sort keys %$percs);
	    foreach my $i (@sort)
       	{
           	push @ids, $percs->{$i};
       	}
    }
    elsif ($param->{column} == 11) 	# sort on in markt
    {
	    @sort = ($param->{reverse} == 0) ? (reverse sort keys %$imkt) : (sort keys %$imkt);
	    foreach my $i (@sort)
       	{
           	push @ids, $imkt->{$i};
       	}
    }
    else					# sort on name
    {
    	@sort = ($param->{reverse} == 0) ? (sort keys %$names) : (reverse sort keys %$names); 
    	foreach my $i (@sort)
       	{
           	push @ids, $names->{$i};
       	}
    }
    return @ids;
}

sub make_kantelpunten_overview(@)
{
	my ($market) = @_;
	
    my $ref = "ShowKantelOverview.pl?";
    $ref .= "all=1" if (defined($param->{all}));
    $ref .= "mine=1" if (defined($param->{mine}));
  	$ref .= "type=success" if (defined($param->{success}));
   	$ref .= "type=correct" if (defined($param->{correct}));
    $ref .= "&uitleg=" . ($param->{budy} ? '0' : '1');
    print_budy($param->{budy}, $page, $ref);

   	my $no_stocks;
	$no_stocks = 1 if (!defined($stocks) && defined($param->{mine}));
    my @ids = get_kantelpunten_ids();
    # make the list with symbols which had a kantelpunt
    my $favorites;
    $favorites = set_favorites() if (defined($param->{open}) || defined($param->{correct}));

    my @stks;
    if (!defined($no_stocks))
    {
	    for (my $i = 0; $i < @ids; $i++)
    	{
        	next if (defined($param->{mine}) && defined($favorites) && (substr($favorites, @ids[$i], 1) eq "0"));
        	push @stks, @ids[$i] if (defined($stocks->{@ids[$i]}));
    	}
	}

    return write_kantelpunten_overview(@stks) if (defined($param->{mail}));
    
    print "<small><small><br></small></small>\n";
    my $option = print_market_table();
    print "<br>\n";
    print "<br>\n" if (defined($param->{correct}));
    print_div("center");

#    my $img = "<img style=\"border: 0px solid ; width: 20px; height: 35px;\" src=\"http://www.kantelpunten.com/pics/icon/uitroepteken_groen.gif\">";
	my $banner_type;
	if (defined($param->{success}))
    {
#  	    print reminder();
#        print_h1("Lopende juiste adviezen", "$img&nbsp;&nbsp;", "&nbsp;&nbsp;$img");
		print "<br>\n";
        print_h1("Lopende juiste adviezen");
    	print_banner_ads("main_banner", defined($param->{mine}) ? "eigen" : "info", undef, 2) if (show_adds("hoofd"));
    	$banner_type = "winst_onder";

    	if (0)
    	{
			my $filter = (rand(100) > 50) ? "nl" : "bel";
    	    print <<EndOfText;
<iframe style="width:468px;height:120px;border:none;" frameborder="0" src="http://www.beurskenners.nl/extern/adviezen.aspx?affiliate=kantelpunten&filter=$filter&backgroundcolor=%23FAFAFA&header_backgroundcolor=%23A6E1D8&header_fontcolor=%23000000&header_fontsize=13&text_backgroundcolor=%23FAFAFA&text_fontcolor=%23000000&text_fontsize=12&link_fontcolor=%23000000"></iframe>
<br><br>
EndOfText
		}
    }
    elsif (defined($param->{correct}))
    {
#		print reminder();
#        print_h1("Advies juistheid", "$img&nbsp;&nbsp;", "&nbsp;&nbsp;$img");
        print_h1("Advies juistheid");
    	print_banner_ads("main_banner", defined($param->{mine}) ? "eigen" : "info", undef, 2) if (show_adds("hoofd"));
    	$banner_type = "juistheid_onder";
    }
    elsif (defined($param->{open}) && ($param->{column} != 6))
    {
	    $banner_type = "kantel_onder";
    }
    
        
    my $num = @stks;
    my $time = $data->{0}->{kantel_time};
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
    my @days = ('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'); 
    my $upd = @days[$wday] . " " . strftime("%d-%m-%Y\n", localtime($time));
    if (defined($param->{all}) || defined($param->{mine}))
    {
        my $title;
        if (defined($param->{all}))
        {
        	$title  = "Onze ";
	        $title .= "adviezen." if (defined($param->{open}));
        }
        else
        {
	        $title  = "Uw ";
	        $title .= "favoriete aandelen." if (defined($param->{open}));
        }
    	print disclaimer() if ($param->{column} != 6);
    	print "<br>\n";
    	if (defined($param->{mine}))
    	{
	        print_h1($title, undef, undef, "bm0");
    	}
    	else
    	{
#		    my $img = "<img style=\"border: 0px solid ; width: 20px; height: 35px;\" src=\"http://www.kantelpunten.com/pics/icon/uitroepteken_blauw.gif\">";
#	        print_h1($title, "$img&nbsp;&nbsp;", "&nbsp;&nbsp;$img", "bm0");
	        print_h1($title, undef, undef, "bm0");
        }
        print_dual_heading(undef, "<small>Bijgewerkt t/m $upd. Updates rond 18u15.</small>");
        print_dual_heading(undef, "<small class=\"black\"><br>Welk koopsignaal kiezen ? Lees <a href=\"/pl/ShowMain.pl?page=20237\">hier</a> meer.</small>");
        print_dual_heading(undef, "<small class=\"black\">Stoplossen zijn nooduitstappen. Lees <a href=\"/pl/ShowMain.pl?page=20269\">hier</a> meer.</small>");
    	print_banner_ads("main_banner", defined($param->{mine}) ? "eigen" : "info", 1) if (show_adds("hoofd"));

        if (0 && !defined($param->{scan}))
        {
		    my $ref1;
    	    $ref1 = "<a href=\"ShowScanOverview.pl?all=1\" rel=\"nofollow\" title=\"Bekijk hier alle openstaande scansignalen\">" if (defined($param->{all}));
	    	$ref1 = "<a href=\"ShowScanOverview.pl?mine=1\" rel=\"nofollow\" title=\"Bekijk hier uw favoriete openstaande scansignalen\">" if (defined($param->{mine}));
	        print <<EndOfText;
<span><small><small><br>
<b>Deze lijst bevat alleen de ${ref1}scansignalen</a> die aan ook aan de bijkomende voorwaarden voldoen.</b><br>
</small></small></span>
EndOfText
		}
        if (0) {
		    my $ref1;
    	    $ref1 = "<a href=\"ShowKantelOverview.pl?all=1\" rel=\"nofollow\">" if (defined($param->{mine}));
	    	$ref1 = "<a href=\"ShowKantelOverview.pl?mine=1\" rel=\"nofollow\">" if (defined($param->{all}));

	        print "<small><br>\n";
		    print interim_heading(undef, "We tonen nu alle adviezen.<br>\"${ref1}Klik hier</a>\" als U uw eigen adviezen wil zien.") if (defined($param->{all}));
    		print interim_heading(undef, "We tonen nu Uw eigen adviezen.<br>\"${ref1}Klik hier</a>\" als U alle adviezen wil zien.") if (defined($param->{mine}));
    		print "</small>\n";
		}
    }
    elsif (defined($param->{success}))
    {
#	    print <<EndOfText;
#<span class="dblack"><small><small>
#"Verkocht" wil zeggen dat we reeds verkochten. Volgens eigen advies.<br>
#</smal></small></span>
#EndOfText
    }
    elsif (defined($param->{correct}))
    {
        my $land = is_nl_enabled($market) ? "Nederlandse" : "";
        $land .= is_be_enabled($market) ? (($land ne "") ? " + Belgische" : "Belgische") : "";
        $land .= " " if ($land ne "");
        
#<big>Hieronder een overzicht van alle adviezen, die we aangeraden hebben.</big><br>
        print <<EndOfText;
<span><small><small><b>
Alle adviezen van de laatste 2 jaar.<br>
Men kan België, Nederland, of beide landen selecteren.<br>
<br><br>
</b></small></small></span>
EndOfText
   		print_pie_graph('big', $total_ok, $total_nok, "Juistheid overzicht van alle ${land}aandelen", undef, undef, $market);
        print "<small><br><br></small>\n";
        print max_info();
        print "<small><br></small>\n";
    }
    print "<br>\n" if (!defined($param->{success}));
    my $nieuw = "";
    $nieuw = "nieuwe " if (($num > 1) || ($num == 0));
    $nieuw = "nieuw " if ($num == 1);
    $nieuw = "" if (defined($param->{open}));
    if ($num == 0)
    {
	    print "<br>\n";
		if (defined($no_stocks))
        {
            print_dual_heading("U HEEFT GEEN FAVORIETEN GEDEFINIËERD");
            print "<small><br></small>\n";            
	        my $ref = "<a href=\"ShowKantelOverview.pl?all=1\">";       
	        print_dual_heading(undef, "\"${ref}Klik hier</a>\" voor alle adviezen.");
	        $ref = "<a href=\"/pl/ShowMain.pl?page=20142\">";       
	        print_dual_heading(undef, "${ref}Lees hier meer over uw favorieten.</a>");
            print "<small><br></small>\n";            
        }
        else
        {
	        print_dual_heading("ER ZIJN GEEN ADVIEZEN.");
        }
    }
    else
    {
        if (defined($param->{all}) || defined($param->{mine}))
        {
        	print_dual_heading($num, "<small>${nieuw}Adviezen.</small>") if ($num > 1);
        	print_dual_heading($num, "<small>${nieuw}Advies.</small>") if ($num == 1);
        	print "<br>\n";
    	}

    	print_table(0, undef, 0, 0, 0, undef, "100%");
		             
        print "<tr>\n";

        my $sep_width = defined($param->{correct}) ? 10 : 25;
    	my $width = 100 - ($sep_width * 2);
    	my $n_status = "Aktie";
    	my $n_trend = "Trend";
    	my $n_juistheid = "Juist%";
	   	$n_status = "Status" if (defined($param->{success}));
    	$n_trend = "Trend" if (defined($param->{correct}) || defined($param->{success}));
        $n_juistheid = "juist%"if (defined($param->{open}));       
		
        # left buttons
       	print " <td width=\"$sep_width%\" valign=\"center\" align=\"center\">\n";
       	print_div("center");   
       	print "&nbsp;\n";
        print_div("end");
	    print " </td>\n";

        my @class;
        my @ind;
        my @ref;
        my $refend = $param->{sort} ? "</a>" : "";
        my $ref = "<a rel=\"nofollow\" href=\"ShowKantelOverview.pl?";
        $ref .= "success=1" if (defined($param->{success}));
        $ref .= "correct=1" if (defined($param->{correct}));
        if (defined($param->{open}))
        {
	        $ref .= "open=1";
        	$ref .= "&all=1" if (defined($param->{all}));
        	$ref .= "&mine=1" if (defined($param->{mine}));
    	}
        for (my $i = 1; $i <= MAX_COLUMN; $i++)
        {
            if ($param->{sort})
            {
	            @ref[$i]   = ($param->{column} == $i) ? ("$ref&reverse=" . (($param->{reverse} == 0) ? "1" : "0") . "&column=$i\" title=\"Verander de sorteer volgorde\">") :
	            								  ("$ref&reverse=$param->{reverse}&column=$i\" title=\"Sorteer op deze kolom\">");
    	        @class[$i] = ($param->{column} == $i) ? "dkantel" : "kantel";
        	    @ind[$i]   = ($param->{column} == $i) ? (($param->{reverse} == 0) ? "v" : "^"): "&nbsp;&nbsp;";
       		}
       		else
       		{
	       		@ref[$i] = "";
	       		@class[$i] = "kantel";
	       		@ind[$i] = "&nbsp;&nbsp;";
       		}
    	}
    	
        # center kantelpunten
        my $slot = ((is_weekend() || is_before_stock_hours() || is_after_stock_hours())) ? 1 : 0;
        $slot = 0 if (defined($param->{correct}) || defined($param->{success}));
        print " <td width=\"$width%\">\n";

        print_div("center");
        print_table(0, undef, 0, 0, 0, undef, "100%", "center", "font-size: 12px;");
        $header  = "";
        $header .= "<tr class=\"f12\">\n";
        $header .= " <th class=\"@class[9]\">&nbsp;&nbsp;</th>";
        $header .= " <th class=\"@class[1]\">&nbsp;@ind[1]@ref[1]Aandeel$refend&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>";
        $header .= " <th class=\"kantel\">&nbsp;Nieuws&nbsp;</th>" if (!defined($param->{correct}));
        $header .= " <th class=\"@class[2]\">@ind[2]@ref[2]Markt$refend&nbsp;&nbsp;</th>";
        $header .= " <th class=\"@class[3]\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ind[3]@ref[3]Date$refend&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>" if (0);
        $header .= " <th class=\"@class[4]\">@ind[4]@ref[4]$n_trend$refend&nbsp;&nbsp;</th>" if (!defined($param->{correct}) && !defined($param->{success}));
        $header .= " <th class=\"kantelr\">&nbsp;Slot&nbsp;</th>" if ($slot);
        $header .= " <th class=\"@class[5]\">@ind[5]@ref[5]Kantelpunt$refend&nbsp;&nbsp;</th>" if (defined($param->{kantelpunt}));
        $header .= " <th class=\"@class[6]\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ind[6]@ref[6]$n_status$refend&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>" if (!defined($param->{correct}));
        $header .= " <th class=\"kantelr\">&nbsp;Trigger&nbsp;</th>" if (defined($param->{open}));
        $header .= " <th class=\"kantelr\">&nbsp;&nbsp;&nbsp;Min%&nbsp;&nbsp;&nbsp;</th>" if (defined($param->{open}));
        $header .= " <th class=\"kantelr\">&nbsp;&nbsp;&nbsp;Max%&nbsp;&nbsp;&nbsp;</th>" if (defined($param->{open}));
        $header .= " <th class=\"kantelr\">&nbsp;Dag#&nbsp;</th>" if (defined($param->{open}));
        $header .= " <th class=\"@class[7]\">@ind[7]@ref[7]Max%$refend&nbsp;</th>" if (defined($param->{correct}));
        $header .= " <th colspan=4 class=\"@class[8]\">@ind[8]@ref[8]Maximale&nbsp;winst&nbsp;</th>" if (defined($param->{success}));
        $header .= " <th class=\"kantelr\">&nbsp;&nbsp;&nbsp;5000&nbsp;€&nbsp;&nbsp;</th>" if (defined($param->{success}));
        my $colspan = 0;
        $colspan++ if (defined($param->{open}));
        $colspan++ if (defined($param->{open}) && defined($favorites));
        $colspan++ if (defined($param->{correct}));
        $header .= " <th colspan=\"$colspan\" class=\"@class[9]\">&nbsp;&nbsp;</th>" if ($colspan);
#        $header .= " <th class=\"@class[10]\">@ind[10]@ref[10]€xit%$refend&nbsp;&nbsp;</th>" if (defined($param->{correct}));
        $header .= " <th class=\"@class[11]\">@ind[11]@ref[11]InMarkt%$refend&nbsp;&nbsp;</th>" if (defined($param->{correct}));
        $header .= " <th class=\"kantel\"></th>" if (defined($param->{correct}) && defined($favorites));
        $header .= " <th class=\"kantel\"><a title=\"Prioriteit gebruikt bij automatische keuze van aandelen.\">&nbsp;Prio&nbsp;</a></th>" if (defined($param->{open}));
        $header .= " <th class=\"@class[12]\">@ind[12]@ref[12]Zitten$refend&nbsp;&nbsp;</th>" if (defined($param->{debug}));
        $header .= " <th class=\"@class[13]\">@ind[13]@ref[13]WhatIf$refend&nbsp;&nbsp;</th>" if (defined($param->{debug}));
        $header .= "</tr>\n";
        print $header if ($param->{column} != 6);
                
        my $stk;
        my $num = 0;
        my $total = @stks;
        if ($param->{column} != 6)
        {
        	print "<tr><td>&nbsp;</td></tr>\n";
        	$num++;	# start with different color
    	}
        foreach $stk (@stks)
        {
            print_short_kantelpunt($stk, $num, $slot, $favorites, $total);
            $num++;
        }
        print_table(0, "end");
        print_div("end");
        
        print " </td>\n";  
    
        # right buttons
       	print " <td width=\"$sep_width%\" valign=\"center\" align=\"center\">\n";
       	print_div("center");   
       	print "&nbsp;\n";
        print_div("end");
	    print " </td>\n";

        print_table(0, "end");
           
        if (0 &&
        	( ($page == 9987) || ($page == 9989) ) )
        {
            my $type = ($page == 9987) ? "success" : "all";
            print "<small><br></small>\n";
            print "<a href=\"ShowKantelOverview.pl?type=$type&mail\">\n";
            print "<img align=\"middle\" style=\"border: 0px solid ; width: 32px; height: 32px;\" alt=\"\"\n";
            print "     title=\"Stuur deze pagina naar een kennis\"\n";
            print "     src=\"http://home.tiscali.nl/trade.extender/pics/mail.gif\">Doorsturen</a>\n";
            print "<small><br></small>\n";
    	}
    	
    	if (defined($banner_type))
	    {
       		print_banner_ads($banner_type, defined($param->{mine}) ? "eigen" : "info", 1, 1) if (show_adds("kantel_tabel"));
    	   	print_banner_ads($banner_type, defined($param->{mine}) ? "eigen" : "info", undef, 2) if (show_adds("kantel_tabel"));
		}
		elsif ($add_count < 2)
		{
       		print_banner_ads("kantel_onder", defined($param->{mine}) ? "eigen" : "info", 1, $add_count+1);
    	   	print_banner_ads("kantel_onder", defined($param->{mine}) ? "eigen" : "info", undef, 2) if ($add_count == 0);
		}

        if (defined($param->{success}))
        {
	        print "<small><br></small>\n";
	        print max_info();
		    print <<EndOfText;
<span><small><small><b>
<br>
Automatisch lijst. Aandelen verdwijnen<br>
uit de lijst, zodra op de trendgrafiek een nieuwe uptrend start.<br>
<br>
<u>Max%</u> : Maximale winst vanaf kooptrigger.<br>
<u>$n_status</u> : De status van ons advies.<br>
<u>$n_juistheid</u> : Juistheid transacties over 2 jaar.<br>
</b></small></small></span>
EndOfText
#            print_dual_heading(undef, "<u>Winst</u> : De totale winst mbv de €xit-strategie over 2 jaar.");
        }
        elsif (defined($param->{correct}))
        {        
#<u>€xit%</u> : De totale winst mbv de €xit-strategie over 2 jaar.<br>
		    print <<EndOfText;
<span><small><small><b>
<br>
<u>$n_juistheid</u> : Juistheid transacties over 2 jaar.<br>
<u>Max%</u> : Bruto maximale winst, van onze adviezen over 2 jaar.<br>
<u>InMarkt%</u> : Percentage in dagen dat we van de 2 jaar in de markt zaten.<br>
De overige tijd had u dus met een <i>ander aandeel</i> winst kunnen maken!<br>
</b></small></small></span>
EndOfText
        }
        elsif (defined($param->{open}) && (($param->{column} != 6) || ($add_status == 1)))
        {
		    print <<EndOfText if ($added_rows);
<br>
<table width="60%" align="center">
<tr class="bg_yellow l_blue"><td class="center">
<span><small><br>
<a href="/pl/ShowOverview.pl?overview=kantel" title="Toon grafieken van openstaande koopsignalen">Bekijk hier de grafieken van alle openstaande koopsignalen.</a><br>
Men ziet de bodems, en opstart van nieuwe uptrends.<br>
<br></small></span>
</td></tr>
</table>
EndOfText
        }

	    print <<EndOfText;
<span><small><small><b>
<br>
Door te klikken op de:<br>
<u>naam/pijl</u> komt men bij het aandeeloverzicht.<br>
<u>$n_juistheid</u> ziet men alle kantelpunten van de laatste 2 jaar.<br>
</b></small></small></span>
EndOfText
#            print_dual_heading(undef, "- hieronder zoeken naar artikelen/adviezen over het aandeel.");
#            print "<br><br>\n";
#            print_dual_heading(undef, "Zoektip: copieer achter Uw aandeel het volgende:</span>");
#            print_dual_heading(undef, "<span style=\"font-style: italic;\">koers OR slot OR volume OR aandeel OR beurs OR winst OR verlies OR persbericht OR</span>", "dark_red");
#            print_google_search("kantelpunten");
        
    }
    print "<br>\n";
		    
#    print disclaimer();
#    print_empty_lines(1, 0);
    print_voet_start($param->{open});
    print_ads("yahoo_klein");    
    print_empty_lines(1, 0);
    print_div("end");
}

sub get_koers(@)
{
	my ($data) = @_;
	
	return 0 						if ($data->{state} == 0);
	return $data->{kantel_trigger} 	if ($data->{state} == 1);
	return 0 				 		if (($data->{state} >= 2) && ($data->{state} <= 8));
	return $data->{stop_set} 		if (($data->{state} >= 9) && ($data->{state} <= 11));
	return $data->{sold_for}        if ($data->{state} == 12);
	log_problem("get_koers: hmm unhandled state $data->{state}");
	return 0;
}

sub print_short_kantelpunt(@)
{
    my ($id, $num, $slot, $favorites, $total) = @_;
    $slot = 0 unless defined($slot);
    my $stock = $stocks->{$id}->{stock};
    my $img;
	my $class = (($num % 2) == 0) ? "even" : "odd";
	my $text = "";
	my $nreg_ref = "<a href=\"/pl/ShowMain.pl?page=10027\" rel=\"nofollow\" title=\"Geregistreerde gebruikers zien ook de adviezen!\">" if (defined($param->{regi}));    

    my $ref =  "/pl/ShowStock.pl?stock=$stock";
    my $koers = get_koers($data->{$id});
    my $doel = undef;
    my $min  = undef;
    my $mclass;

    my $extra_img = "&nbsp;&nbsp;";
    if (defined($param->{open}) && !$data->{$id}->{follow})
    {
	    my $tit = "Wij raden af dit kantelpunt te volgen.";
	    $tit = "Wij hadden afgeraden om dit kantelpunten te volgen!" if ($data->{$id}->{state} == 12);
	    $extra_img = "<a class=\"warn\" href=\"/pl/ShowMain.pl?page=20103\" title=\"$tit\" rel=\"nofollow\"></a>";
    }    
    if ($param->{column} == 6)
    {
    	my $cur_state = get_status($data->{$id}, "head");
	    if ($cur_state ne $prev_state)
    	{
    		my $colspan = $slot ? 13 : 12;
    		$colspan++ if (defined($param->{open}));
    		
    		if ($add_status == 1 && $added_rows)
    		{
	    		$text .= <<EndOfText;
<tr><td>&nbsp;</td></tr>
<tr class="bg_yellow"><td class="center" colspan="$colspan">
<span><br>
<a href="/pl/ShowOverview.pl?overview=kantel" title="Toon grafieken van openstaande koopsignalen">Bekijk hier de grafieken van alle openstaande koopsignalen.</a><br>
Men ziet de bodems, en opstart van nieuwe uptrends.<br>
<br></span>
</td></tr>
EndOfText
    		}
    		$added_rows = 0;
    		if (($add_status > 0) && ($add_count < 2) && show_adds("kantel_tabel"))
    		{
	    		$text .= "<tr><td>&nbsp;</td></tr><tr><td class=\"center\" colspan=\"$colspan\">" .
	    		      print_banner_ads("kantel_onder", defined($param->{mine}) ? "eigen" : "info", undef, undef, "get") .
	    		      "</td></tr>\n";
	    		$add_count++;
    		}
    		$add_status++;
	    	$prev_state = $cur_state;
	    	$text .= "<tr><td>&nbsp;</td></tr><tr><th class=\"kantel f15\" colspan=\"$colspan\">$cur_state</th></tr>\n";
	    	$text .= $header;
	    	if (defined($param->{regi}) && ($data->{$id}->{state} != 12))
    		{
	    		$text .= "<tr><td class=\"regi l_white f15\" colspan=\"$colspan\"><b>&nbsp;&nbsp;&nbsp;Onze adviezen zien? ${nreg_ref}Registreer hier</a>. Het is gratis!&nbsp;&nbsp;&nbsp;</td></tr>\n";
	    		print $text;
	    		return;
    		}
    	}
    }
   	if (defined($param->{regi}) && ($data->{$id}->{state} != 12))
   	{
    	return;
   	}
    
    if ($data->{$id}->{bought_on} && $data->{$id}->{bought_for})
    {
	    if ($data->{$id}->{sold_on} && $data->{$id}->{sold_for})
	    {
	    	$doel = ($data->{$id}->{sold_for} - $data->{$id}->{bought_for}) / $data->{$id}->{bought_for} * 100; 
	    }
	  	$min = $data->{$id}->{min_dif};
	}
    
	# start of row   
    $text .= "<tr>";

    # add the advies pie    
    $img = make_midi_pie_img($stock, $stocks->{$id}->{cur_idx}, $data->{$id}, 'ref');
    $img = "&nbsp;" unless defined($img);
    $text .= "<td class=\"$class\">$img</td>";
    my $add = ""; # " onMouseOver=\"RenderInnerStkMenu(event, $num,'$stocks->{$id}->{stock}','$stocks->{$id}->{index_name}')\" onMouseOut=\"HideInnerStkMenu(0)\"";
    $text .= "<td id=\"its_$num\" class=\"${class}l\">&nbsp;<a href=\"$ref\"$add>" . $stocks->{$id}->{index_name} . "</a></td>";
    if (!defined($param->{correct}) && was_news_since_time($data->{$id}->{last_news}, $data->{$id}->{kantel_time}))
    {
# 	    $text .= "<td class=\"$class\"><a class=\"news\" title=\"Er was nieuws afgelopen sinds kantel punt!\" href=\"/pl/ShowNews.pl?stock=$stock\"></a></td>";
 	    $text .= "<td class=\"$class\"><a title=\"Er was nieuws sinds kantelpunt!\" href=\"/pl/ShowNews.pl?stock=$stock\">JA</td>";
    }
    else
    {
	    $text .= "<td class=\"$class\"></td>" if (!defined($param->{correct}));
    }

    $text .= "<td class=\"$class\">" . make_mini_mkt_img($stocks->{$id}->{mkt_bit}, 1) . "</td>";
    $text .= "<td class=\"${class}r\">" . strftime("%a %d-%m-%Y", localtime($data->{$id}->{kantel_time})) . "&nbsp;</td>" if (0);

    # Make trend image
    $img = undef;
    $img = make_smart_scan_img($stock, $data->{$id}, 'ref', 
    							((defined($param->{success}) || defined($param->{correct}) || defined($param->{open})) ? 'always' : undef) );
    $img = "&nbsp;" unless defined($img);
    $text .= "<td class=\"$class\">$img</td>" if (!defined($param->{correct}) && !defined($param->{success}));
    $text .= "<td class=\"${class}r\">" . sprintf("%.2f", $data->{$id}->{close}) . "&nbsp;</td>" if ($slot);
    $text .= "<td class=\"${class}r\">" . sprintf("%.2f", $data->{$id}->{kantel_trigger}) . "&nbsp;</td>" if (defined($param->{kantelpunt}));
	if (!defined($param->{correct}))
	{
    	$text .= "<td class=\"$class\">" . get_status($data->{$id});
    	if (defined($doel) && defined($param->{open}))
    	{
		    $mclass = (($doel < 0) ? "dred" : "dgreen");
    		$text .= "&nbsp;(<span class=\"$mclass f11\">" . sprintf("%s%.2f%%", (($doel < 0) ? "-" : "+"), abs($doel)) . "</span>)";
		}
		$text .= "</td>";
	}
    if (defined($param->{open}))
    {
	    if (defined($param->{regi}) && ($data->{$id}->{state} != 12))
	    {
		    $text .= "<td class=\"regi l_white\">${nreg_ref}<b>???</b></a></td>";
	    }
	    else
	    {
    		$text .= "<td class=\"${class}r\">" . ($koers ? sprintf("%.2f", $koers) : "&nbsp;") . "&nbsp;</td>";
		}
    	if (defined($min))
    	{
		    $mclass = "${class}r" . (($min < 0) ? " dred" : "");
    		$text .= "<td class=\"$mclass\">" . sprintf("%s%.2f%%", (($min < 0) ? "-" : "+"), abs($min)) . "&nbsp;</td>";
	    	my $max = $data->{$id}->{max_dif};
    		$mclass = ($max >= $param->{perc}) ? "maxr" : (($max > 0) ? "${class}r dgreen" : "${class}r");
   			$text .= "<td class=\"$mclass\">" .  sprintf("+%.2f%", abs($max)) . "&nbsp;</td>";
   			$text .= "<td class=\"$mclass\">" .  (($data->{$id}->{max_days} != 0) ? $data->{$id}->{max_days} : "zelfde") . "&nbsp;</td>";
    	}
    	else
    	{
    		$text .= "<td class=\"$class\">&nbsp;</td>";
    		$text .= "<td class=\"$class\">&nbsp;</td>";
    		$text .= "<td class=\"$class\">&nbsp;</td>";
    	}
	}

    my $anum = $data->{$id}->{num_ok} + $data->{$id}->{num_nok};
    my $juist;
	if (defined($param->{correct}))
	{
		if ($anum != 0)
		{
	    	my $max = $data->{$id}->{max_perc};
   			$mclass = ($max >= $param->{perc}) ? "maxr" : (($max >= 0) ? "${class}r dgreen" : "${class}r dred");
			$text .= "<td class=\"$mclass\">" .  sprintf("%s%.1f%", ($max >= 0) ? "+" : "-", abs($max)) . "&nbsp;&nbsp;</td>";
			my $perc = sprintf("%d", int($data->{$id}->{num_ok} / $anum * 100));
			$perc = "&nbsp;" x (3-length($perc)) . $perc;
			my $van = "$anum";
			$van = "&nbsp" x (2-length($van)) . $van;
			$juist = "<td class=\"${class}r\">$data->{$id}->{num_ok} juist van de $van ( $perc % )&nbsp;</td>";
		}
		else
		{
			$text .= "<td class=\"$class\">niet&nbsp;gevolgd</td>";
			$juist = "<td class=\"$class\"></td>";
		}
	}
	
    $text .= "<td class=\"$class\">" . strftime("%d-%m-%Y", localtime($data->{$id}->{bought_on})) . "</td>" if (defined($param->{trigger}));
   	$text .= "<td class=\"maxr\">" . (($data->{$id}->{max_dif} != 0.0) ? sprintf("+%.2f%", abs($data->{$id}->{max_dif})) : "&nbsp;") . "&nbsp;</td>" if (defined($param->{success}));
    $text .= "<td class=\"maxl\">&nbsp;op&nbsp;</td>" if (defined($param->{success}));
    $text .= "<td class=\"max\">" . (($data->{$id}->{max_days} != 0) ? $data->{$id}->{max_days} : "zelfde") . "</td>" if (defined($param->{success}));
    $text .= "<td class=\"maxl\">&nbsp;" .(($data->{$id}->{max_days} > 1) ? "dagen" : "dag") . "&nbsp;</td>" if (defined($param->{success}));
   	$text .= "<td class=\"${class}r\">&nbsp;&nbsp;" . make_netto_string($stocks->{$id}->{stock}, undef, undef, undef, $data->{$id}->{bought_for}, 
						$data->{$id}->{bought_on}, $data->{$id}->{bought_for} + ($data->{$id}->{bought_for} * $data->{$id}->{max_dif} / 100),
						$data->{$id}->{bought_on}) . "&nbsp;</td>" if (defined($param->{success}));
	if (defined($param->{open}))
	{
#	    $img = make_midi_advies_img($data->{$id}->{follow});
#	    $text .= "<td class=\"$class\">$img</td>";
        $text .= "<td class=\"$class\">$extra_img</td>";
    }
    $text .= $juist if (defined($param->{correct}));
    
    my $dif = $data->{$id}->{perc_gain};
    if ($dif > -900)
    {
	    if (($num == 0) && defined($param->{correct}))
	    {
 #   		$text .= "<td class=\"$class\">&nbsp;</td>";
    		$text .= "<td class=\"$class\">&nbsp;</td>";
	    }
	    else
	    {
#		    $mclass = $class . (($dif < 0) ? " dred" : " dgreen");
#   		$text .= "<td class=\"$mclass\">" . sprintf("%s%.2f%%", (($dif < 0) ? "-" : "+"), abs($dif)) . "</td>" if (defined($param->{correct}));
			if (defined($param->{correct}))
			{
				my $imkt = ($data->{$id}->{tot_days} <= 0) ? "0%" : sprintf("%.0f%%", (($data->{$id}->{num_days} / $data->{$id}->{tot_days}) * 100));
				$text .= "<td class=\"${class}r\">$imkt&nbsp;&nbsp;&nbsp;</td>";
			}
		}
	}
	elsif (defined($param->{correct}))
	{
#		$text .= "<td class=\"$class\"><a class=\"help\" title=\"We handelen alleen in aandelen met juistheid groter dan 60%\" href=\"/pl/ShowMain.pl?page=20103\" rel=\"nofollow\"></a></td>";
		$text .= "<td class=\"$class\">&nbsp;</td>";
	}
    if (defined($favorites))
    {
		if (substr($favorites, $id, 1) eq "0")
		{
			$text .= "<td class=\"$class\"><a class=\"mfav_add\" rel=\"nofollow\" href=\"/pl/ShowFavorites.pl?action=add&stock=$stock\" title=\"Voeg $stocks->{$id}->{index_name} toe aan mijn favorieten\">&nbsp;</a></td>";
		}
		else
		{
			$text .= "<td class=\"$class\"><a class=\"mfav_del\" rel=\"nofollow\" href=\"/pl/ShowFavorites.pl?action=remove&stock=$stock\" title=\"Verwijder $stocks->{$id}->{index_name} van mijn favorieten\">&nbsp;</a></td>";
		}
    }
    $text .= "<td class=\"$class\">$data->{$id}->{follow}</td>" if (defined($param->{open}));
	if (defined($param->{debug}))
	{
		my $splitf = get_split_factor($stock, $data->{$id}->{per_date}, $data->{$id}->{quote_last});
		my $zitten = (($data->{$id}->{close} * $splitf) - $data->{$id}->{per_open}) / $data->{$id}->{per_open} * 100;
		if ($id == 18)
		{
			print "$stock $splitf $zitten $data->{$id}->{close} $data->{$id}->{per_open} <br>\n";
		}
	    $mclass = $class . (($zitten < 0) ? " dred" : " dgreen");
    	$text .= "<td class=\"$mclass\">" . sprintf("%s%.2f%%", (($zitten < 0) ? "-" : "+"), abs($zitten)) . "</td>";
		if ($data->{$id}->{perc_gain} > 0)
		{
			my $total = $data->{$id}->{perc_gain} + $data->{$id}->{perc_gain} / $data->{$id}->{num_days} * ($data->{$id}->{tot_days} - $data->{$id}->{num_days});
			$total = sprintf("+%.1f%%", $total);			
			$text .= "<td class=\"$class dgreen\">$total</td>";
		}
		else
		{
			$text .= "<td class=\"$class\">&nbsp;</td>";
		}
	}
    $text .= "</tr>\n";

    $added_rows++;
    
    print $text;
}

sub write_kantelpunten_overview(@)
{
	my $winst = ($page == 9987) ? 1 : 0;
	
    my $num = @_;
    my $time = $num ? $data->{@_[0]}->{quote_last} : $data->{1}->{quote_last};
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
    my @days = ('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'); 
    my $upd = @days[$wday] . " " . strftime("%d-%m-%Y\n", localtime($time));
    my $img = "<img style=\"border: 0px solid ; width: 20px; height: 35px;\" src=\"http://home.tiscali.nl/trade.extender/pics/uitroepteken_groen.gif\">";
	my $text;
    my $head = $winst ? "<i>Lopende juiste adviezen</i>&nbsp;$img" : "Alle Adviezen van $upd";
	
	$text = <<EndOfText;
<body style="background-color: rgb(255, 204, 153);"
      alink="#000000" link="#000000" vlink="#000000">
<div style="text-align: center;">
<span style="color: rgb(0, 0, 153); font-family: verdana;">
 <small style="font-weight: bold;"><big><big><big>$head<br></big></big></big>
 </small>
</span>
<br>
EndOfText
	print TXT $text;

	if ($winst)
	{
		$text = <<EndOfText;
<table  border="0" cellpadding="0" cellspacing="0" width="100%" align="center" style="font-size: 15px;">
 <tbody>
<tr style="font-family: trebuchet ms;">
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aandeel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </th>
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;&nbsp;&nbsp;&nbsp;Trend&nbsp;&nbsp;&nbsp;&nbsp;
 </th>
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;&nbsp;Max%&nbsp;&nbsp;
 </th>
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;Dagen#&nbsp;
 </th>
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;Juist%&nbsp;
 </th>
</tr>
EndOfText
	}
	else
	{
		$text = <<EndOfText;
<table  border="0" cellpadding="0" cellspacing="0" width="100%" align="center" style="font-size: 15px;">
 <tbody>
<tr style="font-family: trebuchet ms;">
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aandeel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </th>
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 </th>
 <th style="text-align: center; background-color: rgb(255, 187, 119);" valign="middle">
  &nbsp;&nbsp;&nbsp;&nbsp;Trend&nbsp;&nbsp;&nbsp;&nbsp;
 </th>
</tr>
EndOfText
	}

	print TXT $text;
		
    my $stk;
    my $num = 0;
    foreach $stk (@_)
    {
		write_short_kantelpunt($stk, $winst, (($num % 2) ? "light_kantel" : undef));
        $num++;
        last if ($winst && $num >= 10);
    }
	$text = <<EndOfText;
 </tbody>
</table>
<br>
Meer informatie bezoek dan <a href="http://www.kantelpunten.com/pl/Redirect.pl?page=$page">deze</a> pagina<br>
<br>
</body>
</div>
EndOfText
	print TXT $text;
}   

sub write_short_kantelpunt(@)
{
    my ($id, $winst, $bcolor) = @_;
    my $stock = $stocks->{$id}->{stock};
    my $ref_id = sprintf("%03d", $id); 
    my $ref =  "http://www.kantelpunten.com/pl/Redirect.pl?page";
    my $dif = ($data->{$id}->{max_dif} != 0.0) ? sprintf("+%.2f%", abs($data->{$id}->{max_dif})) : "&nbsp;";
    my $num = $data->{$id}->{num_ok} + $data->{$id}->{num_nok};
    $num = 1 if ($num == 0);
    my $perc = sprintf("%.1f%", $data->{$id}->{num_ok} / $num * 100);
    my $days = int(($data->{$id}->{max_date}-$data->{$id}->{bought_on})/(24*3600));
    my $date = strftime("%a %d-%m-%Y\n", localtime($data->{$id}->{kantel_time}));
    $days++;
    $days = 0 if ($days < 0);
    my $text;
    $bcolor = defined($bcolor) ? " background-color: rgb(255, 216, 176);" : " background-color: rgb(255, 204, 153);";
    my $img = make_kantel_img($stock, $stocks->{$id}->{cur_idx}, $data->{$id}, undef, 'info', 'always');
        $img = "&nbsp;" unless defined($img);
    
    if ($winst)
    {
    	$text = <<EndOfText;
<tr style="font-family: trebuchet ms;">
 <td style="text-align: center;$bcolor" valign="middle">
  <a href="$ref=$id">$stocks->{$id}->{index_name}</a>
 </td>
 <td style="text-align: center;$bcolor" valign="middle">
  <a href="$ref=45$ref_id">$img</a>
 </td>
 <td style="text-align: center; background-color: rgb(0, 255, 0);" valign="middle">
  $dif
 </td>
 <td style="text-align: center;$bcolor" valign="middle">
  $days
 </td>
 <td style="text-align: center;$bcolor" valign="middle">
  <a href="$ref=47$ref_id">$perc</a>
 </td>
</tr>
EndOfText
	}
	else
	{
    	$text = <<EndOfText;
<tr style="font-family: trebuchet ms;">
 <td style="text-align: center;$bcolor" valign="middle">
  <a href="$ref=$id">$stocks->{$id}->{index_name}</a>
 </td>
 <td style="text-align: center;$bcolor" valign="middle">
  $date
 </td>
 <td style="text-align: center;$bcolor" valign="middle">
  <a href="$ref=47$ref_id">$img</a>
 </td>
</tr>
EndOfText
	}
	print TXT $text;
}
 
sub add_under_construction()
{
	my $domain = get_domain();
	my $webmaster_email = "<a href=\"mailto:webmaster\@$domain\" target=\"_blank\">webmaster\@$domain</a>";
	my $sign = "Toppy,<br>Webmaster & beursprogammeur.<br>$webmaster_email";

	return <<EndOfText;
<font style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);" color="black" face="Verdana" size="5">
 Bezig met de ontwikkeling,
</font>
<br><br>
<div align="center">
<span style="font-family: verdana; color: rgb(51, 51, 51);">
 <small>
  <br>
  Geachte gebruiker,<br>
  <br>
  We zijn heel druk bezig om het duidelijker te maken hoe men gebruik<br>
  moet maken van de kantelpunten.<br>
  Vandaar dat we bezig zijn met de verbetering van de site<br>
  <br>
  Ons uitgangs punt in het kort:<br>
  <list>
  <li>Bekijk de verse scan-aanbiedingen van de dag.</li> 
  <li>Koop op het kantelpunt.</li> 
  <li>Verkoop met voledoende winst (bv 2ŕ4 %).</li>
  </list><br>
  <br>
  Floppy heeft ons <a href="http://www.kantelpunten.com/pl/ShowMain.pl?page=20094">'uitgangspunt' hier</a> beschreven<br>
  <br>
  Als we zo ver zijn dan maken we de nieuwe functionaliteit beschikbaar<br>
  Een voordeel van registratie is dat we u dan ook daarop van de hoogte<br>
  kunnen stellen via een nieuwsbrief.<br>
  <br>
  De vernieuwde kantelpunten informatie zal het volgende tonen:<br>
  <list>
  <li>Welke scanpunten ook daadwerkelijk kantelpunten zijn.</li>
  <li>Dagelijks op te volgen acties als we in de markt zitten.</li>
  <li>Dagelijks veranderende adviezen over te zetten stoplossen om winst vast te leggen.</li>
  <li>En nog meer ...</li>
  </list><br>
  <br>
  Dus nog even geduld en bezoek onze site op een later moment nog eens.<br>
  Kijk <a href="http://www.kantelpunten.com/pl/ShowMain.pl?page=20099">hier voor meer info en een sneak preview</a>.<br>
  <br>
  $sign<br>
 </small>
</span>
</div>
EndOfText
}

sub make_script()
{
	my $add_script = <<EndOfText;
	function RenderMenu(e, stock, label)
	{
		document.getElementById("bb_label").innerHTML = label;
		document.getElementById("bb_label").setAttribute("url", "/pl/ShowStock.pl?stock=" + stock);
		document.getElementById("bb_graph").setAttribute("src", "http://www.kantelpunten.com/php/ShowKantel.php?type=sbb&stock=" + stock);
		document.getElementById("bb_graph").setAttribute("url", "/pl/ShowStock.pl?stock=" + stock);
		document.getElementById("bb_chart").setAttribute("src", "http://www.kantelpunten.com/php/ShowChart.php?type=sweek&stock=" + stock);
		document.getElementById("bb_chart").setAttribute("url", "/pl/ShowStock.pl?stock=" + stock);
	
		ShowMenuDelayed(e, "bb_menu");
	}
EndOfText

    my $script = make_menu_script($add_script, "x + 5");
	return $script;
}
	