#!/bin/perl

package myHTML;

use strict;

require Exporter;
use vars qw($VERSION @ISA @EXPORT);

$VERSION = 1.00;

@ISA     = qw(Exporter);
@EXPORT  = qw(&p &p2 &ins_dirs &random_pic &my_button_home &my_button_help	&my_checked &my_button_folder &my_button_back
       &my_button_back_off &my_button_first &my_button_next &my_button_next_off &my_random_pic &my_button_last &my_always_create
	&my_pic_of_day &my_create_content	&my_pic_breite &my_tmp_path &my_pic_path &my_bilder_path &my_dat_path &my_log_path
	&my_inf_path &my_wer_path %dirs &add_value &get_top_ten &votings &my_button_info &my_button_no_info &my_button_google &my_button_save
	&my_button_mail &my_button_voting &my_button_slide &write_log &my_button_empfehlung &my_button_werist &my_button_ichsuche);

our ($home_pic, $help_pic, $checked, $folder, $button_back, $button_back_off, $button_save, $button_mail, $button_empfehlung);
our ($button_first, $button_next, $button_next_off, $button_last, $button_no_info, $button_info, $button_google, $button_voting);
our ($always_create_content, $picture_of_day, $pic_breite, %dirs, $button_werist, $button_ichsuche, $button_slide);

our $pic_path    = "../pics/";
our $tmp_path    = "../temp/";
our $dat_path    = "../data/";
our $log_path    = "../logs/";
our $inf_path    = "../infos/";
our $bil_path    = "../bilder/";
our $wer_path    = "../werist/";

$home_pic        = $pic_path . "home.gif";
$help_pic        = $pic_path . "help.gif";
$checked         = $pic_path . "check.gif";
$folder          = $pic_path . "open_icon.gif";

$button_back        = $pic_path . "back.gif";#arrow.gif";
$button_back_off    = $pic_path . "inactive.gif";
$button_first       = $pic_path . "first.gif";#arrow.gif";

$button_next        = $pic_path . "next.gif";#goarrow.gif";
$button_next_off    = $pic_path . "inactive.gif";
$button_last        = $pic_path . "last.gif";#arrow.gif";

$button_no_info     = $pic_path . "no_info.gif";
$button_info        = $pic_path . "info.gif";
$button_google      = $pic_path . "google.gif";
$button_save        = $pic_path . "save.gif";
$button_mail        = $pic_path . "email.gif";
$button_voting      = $pic_path . "voting.gif";
$button_empfehlung  = $pic_path . "empfehlung.gif";
$button_werist      = $pic_path . "werist.gif";
$button_ichsuche    = $pic_path . "ichsuche.gif";
$button_slide       = $pic_path . "slide.gif";

$always_create_content = 0;
        # 1: bei jedem lesen eines Bilderverzeichnisses content neu erstellen
		    # Bei anderen Werten erfolgt keine neuerstellung wenn content datei vorhanden ist
		    # Das kann zu Problemen führen wenn sich dateinamen ändern sollten, da ansonsten nur
		    # wenn keine content-datei vorhanden ist eine neuerstellung erfolgt.

$picture_of_day        = 1;
                    # 1: einmal pro tag ein neues bild
		    # 0: bei jedem seitenzugriff ein neues bild

$pic_breite="400";

# die funktionen bis einschließlich my_button_slide
# geben nur die werte div. variablen zurück über die
# die gesamte webseite gesteuert wird.
# bspw. bildbreite, div. pfade,
# picture_of_day (wann soll neues bild auf begrüssungsseite erstellt werden?)
# always_create_content (wann soll neue content-datei erstellt werden?)

sub my_tmp_path {
	return $tmp_path;
}

sub my_pic_path {
	return $pic_path;
}

sub my_bilder_path {
	return $bil_path;
}

sub my_dat_path {
	return $dat_path;
}

sub my_log_path {
	return $log_path;
}

sub my_inf_path {
	return $inf_path;
}

sub my_wer_path {
	return $wer_path;
}

sub my_pic_breite {
	return $pic_breite;
}

sub my_pic_of_day {
	return $picture_of_day;
}

sub my_always_create {
	return $always_create_content;
}

sub my_button_last {
	return $button_last;
}

sub my_button_next_off {
	return $button_next_off;
}

sub my_button_next {
	return $button_next;
}

sub my_button_first {
	return $button_first;
}

sub my_button_back_off {
	return $button_back_off;
}

sub my_button_back {
	return $button_back;
}

sub my_button_folder {
	return $folder;
}

sub my_checked {
	return $checked;
}

sub my_button_help {
	return $help_pic;
}

sub my_button_home {
	return $home_pic;
}

sub my_button_no_info {
	return $button_no_info;
}

sub my_button_info {
	return $button_info;
}

sub my_button_google {
	return $button_google;
}

sub my_button_save {
	return $button_save;
}

sub my_button_mail {
	return $button_mail;
}

sub my_button_voting {
	return $button_voting;
}

sub my_button_empfehlung {
	return $button_empfehlung;
}

sub my_button_werist {
	return $button_werist;
}

sub my_button_ichsuche {
	return $button_ichsuche;
}

sub my_button_slide {
	return $button_slide;
}
######################################################################

sub add_value {
	my ($act,$value,$pic)=@_;
	my $dat=my_dat_path;
	open VOTE, "<$dat/voting";
	my @voting=<VOTE>;
	close VOTE;
	
	write_log("voting","$act $value $pic");
	
	my $new=1;
	open VOTE, ">$dat/voting";
	foreach my $line (@voting) {
		chomp $line;
		my ($name,$count,$sum)=split/,/,$line;
		if ($name eq $act) {
			$count++;
			$sum = $sum + $value;
			$new=0;
			
		}
		print VOTE "$name,$count,$sum\n";
	}
	
	if ($new==1) {
		print VOTE "$act,1,$value\n";
	}
	close VOTE;
	
}

sub get_top_ten {
	
	#write_log("voting","zeige");
	my $data=my_dat_path;
	open VOTE, "<$data/voting";
	my @voting=<VOTE>;
	close VOTE;
	
	my %votes;
	foreach (@voting) {
		chomp;
		my ($name,$count,$value)=split/,/,$_;
		$votes{$name}=$value / $count;
	}

	my %orig_votes=%votes;
	my @topten;
	for (my $i=0;$i<10;$i++) {
		my $j=1;
		foreach my $name (keys %votes) {
			$topten[$i]=$name if ($j==1);
			$j=0;
			if ($votes{$name} > $votes{$topten[$i]}) {
				$topten[$i]=$name;
			}
		}
		delete $votes{$topten[$i]};
	}
	my %res;
	for (my $i=0;$i<10;$i++) {
		$res{$i+1}=[$orig_votes{$topten[$i]},$topten[$i]];
	}
	return %res;
}

sub votings {
	my $data=my_dat_path;
	open VOTE, "<$data/voting";
	my @voting=<VOTE>;
	close VOTE;
	
	my $votes;
	foreach (@voting) {
		chomp;
		my ($name,$count,$value)=split/,/,$_;
		$votes = $votes + $count;
	}
	return $votes;
}

sub p2 {
    # kurzform für print.
    # als parameter können mehrere zeichenfolgen angegeben werdenn
    # \n wird angehängt => strukturierte html-datei wird erstellt.
	my (@txt) = @_;
	foreach (@txt) { p ("$_"); }
	print "";
}

sub p {
    # kurzform für print.
    # als parameter kann nur eine zeichenfolge angegeben werden
    # \n wird angehängt => strukturierte html-datei wird erstellt.
	my ($txt) = @_;
	print "$txt\n";
}

sub td {
    # gibt übergebenen parameter als table-definition aus!
	my (@txt) = @_;
	foreach (@txt) { p ("<td>$_</td>"); }
}

sub tdc {
    # gibt übergebenen parameter als zentrierte table-definition aus!
	my (@txt) = @_;
	foreach (@txt) { p ("<td align='center'>$_</td>"); }
}

sub start_html {
    # gibt start einer html-datei aus, übergebene Parameter
    # werden in head eingefügt
	my (@head) = @_;
	p2 ("<html>","<head>",@head,"</head>","<body>");
}

sub end_html {
	p2 ("</body>","</html>");
}

sub db_ins_del {
    # fügt einen eintrag zur datenbank hinzu .
    # insert wird als parameter übergeben!
	my ($cs,$usr,$pwd,$sta) = @_;
	my $dbh = DBI->connect("$cs","$usr","$pwd", {RaiseError => 1});
	$dbh->do("$sta");
	$dbh->disconnect;
}

sub selec {
    # führt datenbank-select auss
    # benutzen um einen einzelnen wert zu selektieren
	my ($dbc,$dbu,$dbp,$sel) = @_;
	my $ret;
	my $dbh = DBI->connect("$dbc","$dbu","$dbp", {RaiseError => 1});
	my $sth = $dbh->prepare("$sel");
	$sth->execute;
	#$ret = $sth;
	#$dbh->disconnect;
	return $sth;
}

sub selec2 {
    # führt db-select aus
    # benutzen um mehrere werte zu selektieren
	my ($dbc,$dbu,$dbp,$sel) = @_;
	my $dbh = DBI->connect("$dbc","$dbu","$dbp", {RaiseError => 1});
	my $sth = $dbh->prepare("$sel");
	my @erg;
	$sth->execute;
	while (my $ref = $sth->fetchrow_arrayref()) {
		#print @{$ref};
		@erg=(@erg,@{$ref});
	}
	return @erg;
}

sub my_random_pic {
    # gibt den hash-key (namen) und den datei-namen zurück
    # der name wird aus pic-of-day-datei gelesen wenn in flag-datei
    # richtiges datum steht und nicht bei jedem zugriff ein neues bild
    # zufällig ausgewählt werden soll.   ($picture_of_day)
	my ($t1,$t2,$t3,$dd,$mm,$yy,$t4)=localtime;
	my ($f_dd,$f_mm,$f_yy);
	my ($pic_of_day,@pictures,$girl);

	my $picture_of_day = my_pic_of_day;
	my $dir_of_day;

  my $data=my_dat_path;
	open FLAG, "<${data}flag";
	while (<FLAG>) {
		($f_dd,$f_mm,$f_yy)=split/-/;
	}
	close FLAG;

	if ($f_dd == $dd and $f_mm == $mm and $f_yy == $yy and $picture_of_day==1) {
		open IMG, "<${data}pic_of_day";
		while (<IMG>) {
			$pic_of_day = $_;
		}
		close IMG;
	}
	else {
		my @direcs;
		foreach my $directory (values %dirs) {
			@direcs = (@direcs,$directory);
		}
		do {
			my $random1 = int(rand(@direcs));
			$dir_of_day = $direcs[$random1];
		} while (! (-e "$dir_of_day/content"));

		# Liest content Datei aus ausgewähltem Verzeichnis
		# in @pictures ein
		open CONTENT, "<$dir_of_day/content";
		@pictures = <CONTENT>;
		close CONTENT;

		# Wähle ein Bild aus @pictures aus
		my $random2 = int(rand(@pictures));
		$pic_of_day = $pictures[$random2];
		chomp $pic_of_day;
		$pic_of_day = "$dir_of_day" . "/" . (split /,/,$pic_of_day)[1];

		open IMG, ">${data}pic_of_day";
		print IMG $pic_of_day;
		close IMG;

		open FLAG, ">${data}flag";
		print FLAG "$dd-$mm-$yy";
		close FLAG;

	}
	my $value = $pic_of_day;
	$value =~ s/\/[a-z0-9-'´_()]*\.[a-z]{3}$//i;
	foreach my $key (keys %dirs) {
		if ($dirs{$key} eq $value) {
			$girl = $key;
		}
	}
	return ($girl,$pic_of_day);
	#return ($dir_of_day,$pic_of_day);
}

sub ins_dirs {
	$dirs{""} = "../bilder/";

	open HASH, "<created_hash.txt";
	my @HASH = <HASH>;
	close HASH;

	foreach my $line (@HASH) {
		eval $line;
	}
	delete $dirs{''};

}

sub my_create_content {
    # erstellt content-datei, sofern nicht vorhanden oder wenn vorhanden
    # UND my_always_create == 1
	my ($directory) = @_;
	my $always_ne = my_always_create;
	my $create_cont=0;

	if (-e "$directory/content") { # content existiert im verzeichnis $dir
		if ($always_ne) { # aber immer neu erstellen!
			$create_cont=1; # content wird überschrieben
		}
		else { # nicht immer neu erstellen und da content vorhanden
			$create_cont=0; # nicht neu erstellen
		}
	}
	else { # content existiert nicht > neu erstellen
		$create_cont=1;
	}

	if ($create_cont) { # erfolgt evtl. bei jedem aufruf dieses skripts !!!
		# Verzeichnis lesen und content erstellen!

		# für leere content-datei sorgen!
		open CONTENT, ">$directory/content";
		close CONTENT;
		if (opendir DH, $directory) {
			my $count = -1;
			foreach my $file (readdir DH) {
				if ( $file =~ /\.jpg$/ or
					  $file =~ /\.bmp$/ or
					  $file =~ /\.jpeg$/ or
					  $file =~ /\.gif$/) {
				    # nimmt nur jpg, bmp, gif und jpeg dateien in
				    # index-datei content auf!
					#unless ($file=~/['()]/) {
					    # überspringt dateienn die ein  ', (, oder  )
					    # enthalten
						$count++;
						open CONTENT, ">>$directory/content" or die "Cannot open file:\n$directory/content:\n$!\n\n";
						print CONTENT "$count,$file\n";
						close CONTENT;
					#}
				}
			}
			closedir DH;
		}
	}
}

sub write_log {
	my ($action,$txt)=@_;
	my ($t1,$mi,$hh,$dd,$mo,$yy,$t2)=localtime;
	my $path=my_log_path;
	$mo++;
	$yy+=1900;
	
	$action =~ tr/[a-z]/[A-Z]/;
	my $logfile = "$path/$action"."_actions.log";
	open LOGF, ">>$logfile";
	printf LOGF "%02d.%02d.%04d %02d:%02d %10s %s\n",$dd,$mo,$yy,$hh,$mi,$action,$txt;
	close LOGF;
}


END {}

1;
