#!/usr/pkg/bin/perl
######################################################################
# Follow Up Mailing List Processor                                   #
# Version 4.20                                                       #
# Copyright 2005 Silihost Kft, SellWide Corporation                                #
# Last modified 07/20/2005                                           #
# Authors: Konstantin Ursaloff and Vadim Rachkowan                   #
# Available at http://www.sellwide.com                               #
######################################################################
#                          COPYRIGHT NOTICE                          #
#                                                                    #
#     Copyright 2005 Silihost Kft. Minden jog fenntartva.      #
#                                                                    #
# This script can be used as  long  as you don't change  this header #
# or  any  of  the  parts  that  give  me  credit  for writing this. #
#                                                                    #
# By using this script you agree to indemnify me from any  liability #
# that might arise from its use.                                     #
#                                                                    #
# Redistributing\selling  the  code  for  this program without prior #
# written consent is expressly forbidden.                            #
#                                                                    #
# Use for any  unauthorized  purpose is expressly prohibited by law, #
# and  may  result  in  severe  civil  and  criminal  penalties.     #
# Violators  will  be  prosecuted  to  the  maximum extent possible. #
#                                                                    #
#        YOU MAY NOT RESELL OR RELEASE THIS PROGRAM TO OTHERS        #
#                                                                    #
######################################################################
use lib('lib');
require 'conf.cgi';
###
%CONF=(); %PAR=();%ACCOUNT=();
###
&par_prepare;
&db_prepare;
unless(keys %LNG){
	&printheader;
	print $q->start_html("Error");
	print $q->h1("Language keys was not loaded");
	print $q->p("Can not find file <B>shabl/$CONF{langnow}.txt");
	print $q->end_html;
	exit;
}
$dparser::lang=\%LNG;
#map{$LNG{$_}="|$LNG{$_}|"}keys %LNG;
local %ACT=        (
        ""        =>\&print_frameset,
        account   =>\&print_account,
	lngset    =>\&print_set_leng,
        mainbody  =>\&print_main,
	'stat'=> =>\&print_stat,
	settings  =>\&print_settings,
	getfile  =>\&print_getfile,
	delfile  =>\&print_delfile,
	doimess	 =>\&print_doimess,
	subscrmess=>\&print_subsmess,
	unsubscrmess=>\&print_unsubsmess,
	showmess=>\&print_show_mess,
	showrfcmess=>\&print_show_rfc_mess
);
local @ACCOUNTMENU=(
        {name=>$LNG{ACCOUNTMENU_MAIN},    params=>{act2=>""}},
        {name=>$LNG{ACCOUNTMENU_OPTIONS},params=>{act2=>"config"},
		description=>$LNG{ACCOUNTMENU_OPTIONS_DESCR}},
        {name=>$LNG{ACCOUNTMENU_HTML_FORM},    params=>{act2=>"columns"},
		description=>$LNG{ACCOUNTMENU_HTML_FORM_DESCR}},
        {name=>$LNG{ACCOUNTMENU_SUBSCR_MAN}, params=>{act2=>"users"},
		description=>$LNG{ACCOUNTMENU_SUBSCR_MAN_DESCR}},
        {name=>$LNG{ACCOUNTMENU_EDIT_MESS}, params=>{act2=>"mess"},
		description=>$LNG{ACCOUNTMENU_EDIT_MESS_DESCR}},
        {name=>$LNG{ACCOUNTMENU_LINKS}, params=>{act2=>"links"},
		description=>$LNG{ACCOUNTMENU_LINKS_DESCR},
		nextlevel=>[
			{
				name=>$LNG{ACCOUNTMENU_LINKS},
				params=>{modelog=>""},
				description=>'',
				add_params=>[qw(datefilter)]
			},
			{
				name=>$LNG{ACCOUNTMENU_LINKS_MESS_STAT},
				params=>{modelog=>"mess"},
				description=>'',
				add_params=>[qw(datefilter)]
			},

			{
				name=>$LNG{ACCOUNTMENU_LINKS_ACT_PROSP},
				params=>{modelog=>"prospects"},
				description=>'',
				add_params=>[qw(datefilter)],
			},			
			{
				name=>$LNG{ACCOUNTMENU_LINKS_CLICKS},
				params=>{modelog=>"clicks"},
				description=>'',
				add_params=>[qw(datefilter)],
			},			
			]
	}
	
);
local @SETTINGSMENU=(
        {name=>$LNG{SETTINGSMENU_MAIN},    params=>{act2=>""}},
        {name=>$LNG{SETTINGSMENU_PERSONAL},params=>{act2=>"personal"},
		description=>$LNG{SETTINGSMENU_PERSONAL_DESCR}},
        {name=>$LNG{SETTINGSMENU_SENDING_OPTIONS},    params=>{act2=>"smtp"},
		description=>$LNG{SETTINGSMENU_SENDING_OPTIONS_DESCR}},
        {name=>$LNG{SETTINGSMENU_ACCESS},    params=>{act2=>"pass"},
		description=>$LNG{SETTINGSMENU_ACCESS_DESCR}},
	{name=>$LNG{SETTINGSMENU_TIME_SYNC},    params=>{act2=>"timecorr"},
		description=>$LNG{SETTINGSMENU_TIME_SYNC_DESCR}},
	{name=>$LNG{SETTINGSMENU_PERFOM},    params=>{act2=>"test"},
		description=>$LNG{SETTINGSMENU_PERFOM_DESCR}},
	{name=>$LNG{SETTINGSMENU_BACUP_RESTORE},    params=>{act2=>"backup"},
		description=>$LNG{SETTINGSMENU_BACUP_RESTORE_DESCR}}
);
local @STATMENU=(
        {name=>$LNG{STATMENU_MAIN},    params=>{act2=>""}},
  	{name=>$LNG{STATMENU_ACT_LOGS},    params=>{act2=>"log"},
		description=>$LNG{STATMENU_ACT_LOGS_DESCR}},
  	{name=>$LNG{STATMENU_CURRENT_BROADCAST},    params=>{act2=>"curlog"},
		description=>$LNG{STATMENU_CURRENT_BROADCAST_DESCR}},
  	{name=>$LNG{STATMENU_TOTALS},    params=>{act2=>"total"},
		description=>$LNG{STATMENU_TOTALS_DESCR},
		nextlevel=>[
			{
				name=>$LNG{STATMENU_TOTALS_SENT_MESS},
				params=>{modelog=>""},
				description=>'',
				add_params=>[qw(day1 day2 month1 month2 year1 year2)]
			},
			{
				name=>$LNG{STATMENU_TOTALS_SUBSCRIBERS},
				params=>{modelog=>"subscribers"},
				description=>'',
				add_params=>[qw(day1 day2 month1 month2 year1 year2)]
			},
			{
				name=>$LNG{STATMENU_TOTALS_PROSPECTS},
				params=>{modelog=>"account"},
				description=>'',
				add_params=>[qw(day1 day2 month1 month2 year1 year2)],
			},			
			]
	},	
);

my $address=$ENV{HTTP_HOST};
my $scriptdir=$ENV{SCRIPT_NAME};
(my $src=$scriptdir)=~s#[^/]*$##;
save_config(0,"serverurl","http://$address${src}");
&sessiya;
&process_all;
##################
sub add_menu_prospects{
my $page_ref=shift;
my $menu;
$menu=<<ALL__;
<table width="100%" border="0" cellspacing="3" cellpadding="1">
	<tr align="center" class="data"> 
		<td><a href="$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=userform&account=$PAR{account}"><NOBR>$LNG{PROSPMENU_ADD_PROSP}</NOBR></a></td>
		<td><a href="$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=import&account=$PAR{account}"><NOBR>$LNG{PROSPMENU_IMPORT}</NOBR></a></td>
		<td><a href="$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=export&account=$PAR{account}"><NOBR>$LNG{PROSPMENU_EXPORT}</NOBR></a></td>
		<td><a href="$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=loadfrom&account=$PAR{account}"><NOBR>$LNG{PROSPMENU_COPY}</NOBR></a></td>	
		<td><a href="$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=bulk&account=$PAR{account}"><NOBR>$LNG{PROSPMENU_BULK_REMOVE}</NOBR></a></td>
	</tr>
</table>
ALL__
$page_ref->add_regesp('{prospects_menu}',$menu);
}
##################
sub process_all{
	if ($ACT{$PAR{act}}){
		my $sub_ref=$ACT{$PAR{act}};
		&$sub_ref if $sub_ref;
	}else{
		printheader();
		print $q->start_html($LNG{ERROR});
		print $q->h1($LNG{ERROR_NOT_CHANGE_URL});
		print $q->end_html;
		exit;
	}
}
###################
sub get_account_menu{
	my $ref_menu=shift;
	my @MENU=@{$ref_menu};
	my $out;
	$out=$q->start_table({-border=>0,-align=>"center",width=>"100%"})."<TR>";
	my $count=@MENU;
	my $width=100/$count."%" if $count;
	my $menu;
	my $acct="";
	$acct='&account='.$PAR{account} if $PAR{account};
	my @menu=map{$q->td({-align=>center, -width=>$width},
				$q->a({-href=>"$SCRIPT_NAME?act=$PAR{act}&act2=".$_->{params}{act2}."&ses=$PAR{ses}".$acct,
						-target=>'_self', -class=>($PAR{act2} eq $_->{params}{act2}) ? 'menuACT' : 'menu'},"<NOBR>$_->{name}</NOBR>")
			)
		}@MENU;
	$out.=join "\n", @menu;
	$out.="</TR>".$q->end_table() ;	
	return $out;
}
########################################
sub get_full_menu{
	my $ref_menu=shift;
	my @MENU=@{$ref_menu};
	my $out;
	$out=<<ALL__;
<table  cellspacing="3" cellpadding="7"  border="0" align="center">
ALL__
	my $acct="";
	$acct='&account='.$PAR{account} if $PAR{account};
	foreach(@MENU){
		next unless ($_->{description});
		my $href=$q->a({-href=>"$SCRIPT_NAME?act=$PAR{act}&act2=".$_->{params}{act2}."&ses=$PAR{ses}".$acct,-target=>'_self'},"<NOBR>$LNG{MENU_GO}</NOBR>");
		$out.=<<ALL__;
	<TR class="data">
                <td bgcolor="#f7dbbf">$href</td>
                <td bgcolor="#f7dbbf"><STRONG>$_->{name}: </STRONG>$_->{description}</td>
              </tr>
ALL__
	}
	$out.=$q->end_table() ;	
	return $out;
}
##################
sub get_full_url{
	my $pars=shift;
	my %pars=%$pars;
	my $qq = new CGI;
	foreach (keys %pars){
		$qq->param($_,$pars{$_})
	}
	#-path_info=>1
	#-query=>1
	return $qq->url(-absolute=>1,-query=>1);
}

####################
#begin mapping functions
####################
#SETTINGS
sub print_settings_main{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	$page->SplitData("#begin#main","#end#main");
	$page->deleteBEFORE_AFTER();
	$page->add_regesp('{main_menu_body}',get_full_menu(\@SETTINGSMENU));
	$page->ParseData;
	return $page->as_string;
}
###################
sub print_settings_personal{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	if ($PAR{issubmit}){
		$page->set_error("adminname",$LNG{ERROR_YOUR_NAME_REQUIRED}) unless $PAR{adminname};
		if ($PAR{adminemail}){
			$page->set_error("adminemail",$LNG{ERROR_EMAIL_INCORRECT}) unless checkemail($PAR{adminemail});
		}else{
			$page->set_error("adminemail",$LNG{ERROR_EMAIL_REQUIRED});
		}
	}
	if ($PAR{issubmit} && !$page->is_error){
		save_config(0,"adminname",$PAR{adminname});
		save_config(0,"adminemail",$PAR{adminemail});
		save_config(0,"statbyemail",$PAR{statbyemail});		
		$page->add_regesp('{error}',"<h1 class=\"mess\">$LNG{MESS_SETTINGS_UPDATED}</h1>");
	}
	$page->set_def("statbyemail",$CONF{statbyemail});
	$page->set_def("adminname",$CONF{adminname});
	$page->set_def("adminemail",$CONF{adminemail});	
	$page->SplitData("#begin#personal","#end#personal");
	$page->deleteBEFORE_AFTER();
	$page->ParseData;
	return $page->as_string;
}
###########################
sub print_settings_smtp{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	my @settings=qw(sendmail modsend smtp COUNT_PROC OLD_ALGORITHM_PROC smtpauth smtpusername smtppassword errorsto smtpuseadminemail smtpfromemail returnpath issendmailf sendmailaddress );
	if ($PAR{issubmit}){
		if ($PAR{modsend} eq ""){
			$page->set_error("modsend",$LNG{ERROR_NOT_SELECTED})
		}else{
			if ($PAR{modsend} eq 'sendmail'){
				unless ($PAR{sendmail}){
					$page->set_error("sendmail",$LNG{ERROR_REQUIRED_SENDMAIL}) 
				}else{
					if($PAR{sendmail}=~/[ ><;&]/){
						$page->set_error("sendmail",$LNG{ERROR_INCORRECT_SENDMAIL_PATH}) 
					}elsif(! -f $PAR{sendmail}){
						$page->set_error("sendmail",$LNG{ERROR_INCORRECT_SENDMAIL_NOT_EXISTS})
					}
					unless($page->is_error){
						if(length($PAR{errorsto})){
							$page->set_error("errorsto",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{errorsto}));				
						}
						if(length($PAR{returnpath})){
							$page->set_error("returnpath",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{returnpath}));				
						}
						if(length($PAR{issendmailf})){
							$page->set_error("sendmailaddress",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{sendmailaddress}));				
						}						
					}
				}
			}elsif($PAR{modsend} eq 'SMTP'){
				$page->set_error("smtp",$LNG{ERROR_REQUIRED_SMTP}) unless $PAR{smtp};
				if($PAR{smtpauth}){
					$page->set_error("smtpusername",$LNG{ERROR_REQUIRED}) unless length($PAR{smtpusername});
					$page->set_error("smtppassword",$LNG{ERROR_REQUIRED}) unless length($PAR{smtppassword});
				}
				if($PAR{smtpuseadminemail}){
					$page->set_error("smtpfromemail",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{smtpfromemail}));
				}
			}
		}
	}
	if ($PAR{issubmit} && !$page->is_error){
		map{save_config(0,$_,$PAR{$_})}@settings;
		$page->add_regesp('{error}',"<h1 class=\"mess\">$LNG{MESS_SETTINGS_UPDATED}</h1>");
	}
	if($CONF{modsend} eq 'SMTP'){
		$page->Hide('<!--HIDEIFSMTP-->');
	}else{
		$page->Hide('<!--HIDEIFSENDMAIL-->');
	}
	map{$page->add_element("COUNT_PROC",$_)}(1..10);
	$page->add_element("modsend","","--select--");
	$page->add_element("modsend","sendmail");
	$page->add_element("modsend","SMTP");
	map{$page->set_def("$_",$CONF{$_})}@settings;
	$page->set_def("sendmailaddress",$CONF{adminemail}) unless length($CONF{sendmailaddress});
	$page->set_def("smtpfromemail",$CONF{adminemail}) unless length($CONF{smtpfromemail});
	$page->SplitData("#begin#smtp","#end#smtp");
	$page->deleteBEFORE_AFTER();
	$page->ParseData;
	return $page->as_string;
}
#################
sub print_settings_timecorr{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	if ($PAR{issubmit}){
		if ($PAR{timecorr} ne ""){
			unless ($PAR{timecorr}=~m#^(\+|-)\d\d:\d\d$#){
				$page->set_error("timecorr",$LNG{ERROR_INCORRECT_FORMAT});
			}
		}
	}
	if ($PAR{issubmit} && !$page->is_error){
		save_config(0,"timecorr",$PAR{timecorr});
		$page->add_regesp('{error}',"<h1 class=\"mess\">$LNG{MESS_SETTINGS_UPDATED}</h1>");
		$CONF{timecorr}=$PAR{timecorr};
		$MY_TIME=time+TimeToSec($CONF{timecorr});
		$NOW=GetNow($PAR{timecorr});
		$db->do("UPDATE ${PREF}ses SET date=$NOW WHERE ran=?", undef, $PAR{ses});
	}
	$page->add_regesp('{time}',scalar(localtime()));
	$page->add_regesp('{mytime}',scalar(localtime($MY_TIME)));
	
	$page->set_def("timecorr",$CONF{timecorr});
	$page->SplitData("#begin#time","#end#time");
	$page->deleteBEFORE_AFTER();
	$page->ParseData;
	return $page->as_string;
}
########################
sub print_settings_pass{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	if ($PAR{issubmit}){
		$page->set_error("oldpass",$LNG{ERROR_INCORRECT}) if ($PAR{oldpass} ne $CONF{adminpwd});
		if ($PAR{newpass1} && $PAR{newpass2}){
			$page->set_error("newpass1",$LNG{ERROR_NOT_EQUAL}) if ($PAR{newpass1} ne $PAR{newpass2});
			$page->set_error("newpass2",$LNG{ERROR_NOT_EQUAL}) if ($PAR{newpass1} ne $PAR{newpass2});
		}else{
			$page->set_error("newpass1",$LNG{ERROR_REQUIRED}) unless $PAR{newpass1};
			$page->set_error("newpass2",$LNG{ERROR_REQUIRED}) unless $PAR{newpass2};			
		}
	}
	if ($PAR{issubmit} && !$page->is_error){
		#save_config(0,"adminpwd",$PAR{newpass1});
		$page->add_regesp('{error}',"<h1 class=\"mess\">$LNG{MESS_SETTINGS_UPDATED}</h1>"."<A href=\"$SCRIPT_NAME\" target=\"parent\">$LNG{MESS_LOGOUT_TO_CHECK}</a>");
	}

	$page->SplitData("#begin#pass","#end#pass");
	$page->deleteBEFORE_AFTER();
	$page->ParseData;
	return $page->as_string;
}
#############Backup
sub get_dir_size{
my $dir=shift;
my $dirsize=0;
if (-d "$dir"){
	my @files;
	opendir(DIR,$dir) || die $LNG{ERROR_CANT_OPEN_DIR};
	while (my $file=readdir(DIR)){
		next if ($file=~/^\.+$/);
		push (@files,$file);
	}
	closedir(DIR);
	foreach my $file(@files){
		if(-d "$dir/$file"){
			$dirsize += get_dir_size("$dir/$file");
		}else{
			$dirsize += (stat("$dir/$file"))[7];
		}
	}
}elsif(-f $dir){
	return (stat("$dir"))[7];
}
return $dirsize;
}
###################
sub remove_dir{
my $dir=shift;
if (-d "$dir"){
	opendir(DIR,$dir) || die $LNG{ERROR_CANT_OPEN_DIR};
	my @files;
	while (my $file=readdir(DIR)){
		next if ($file=~/^\.+$/);
		push (@files,$file);

	}
	closedir(DIR);
	foreach my $file(@files){
		if(-d "$dir/$file"){
			remove_dir("$dir/$file");
		}else{
			unlink("$dir/$file") || die "$LNG{ERROR_CANT_UNLINK_FILE} $dir/$file";
		}
	}
}
rmdir($dir);
}
sub create_backup{
	my $name=shift;
	unless (-d $glbackupdir){
		mkdir($glbackupdir,0777) || die "${ERROR_CANT_CREATE_DIR} $glbackupdir : $!";
	}
	my @tables=map{"${PREF}$_"}@backup_tables;
	return if ($name=~/[^a-zA-Z0-9_-]/);
	my $dirstore="$glbackupdir/$name";
	remove_dir($dirstore) if (-d $dirstore);
	mkdir($dirstore,0777) || die "${ERROR_CANT_CREATE_DIR} $dirstore : $!";
	my $path;
	if($ENV{PATH_TRANSLATED}){ 
		$path="$ENV{PATH_TRANSLATED}";
	}elsif($ENV{SCRIPT_FILENAME}){
		$path="$ENV{SCRIPT_FILENAME}";
	}
	my $delm;
	$delm='/' if $path=~/\//;
	$delm='\\' if $path=~/\\/;
	my @path=split(/\/|\\/,$path);
	$path=join($delm, @path[0..@path-2]);
	foreach $table(@tables){
		my $filename="$path${delm}$glbackupdir${delm}$name${delm}$table.dmp"; 
		open (FILE,">$filename") || die "$LNG{ERROR_CANT_OPEN_FILE} $filename $LNG{ERROR_CANT_WRITE}";
		my $sql="SHOW fields FROM $table";
		my $out=$db->prepare($sql);
		$out->execute();
		my @cols;
		while (my @output=@{$out->fetchrow_arrayref}){
			push (@cols,$output[0]);
		}
		print FILE join("\t",@cols)."\n";
		my $sql="SELECT * from $table";
		my $out=$db->prepare($sql);
		$out->execute();
		while (my %output=%{$out->fetchrow_hashref}){
			@output=map{$db->quote($output{$_})}@cols;
			#map{s/\t/\\t/g}@output;
			print FILE join(", ",@output)."\n";
		}
		close(FILE);
	}
	unless ($^O=~/win/i){
		#Linux
		chdir($glbackupdir);
		`tar -cf $name.tar $name`;
		`gzip $name.tar`;
		chdir("..");
		remove_dir("$glbackupdir/$name");
	}else{
		
	}
}
sub LoadTableFromFile{
	my($table,$file)=@_;
	unless(open (FILE,$file)){
		die ("$LNG{ERROR_CANT_OPEN_FILE} : $! ");
		return;
	}
	$db->do("DELETE FROM $table");
	unless($file=~/attach/){
	#	local $/="\n";
		my $cols=<FILE>;
		chomp($cols);
		my @cols=split(/\t/,$cols);
		$cols=join(", ",@cols);
		while (<FILE>){
			chomp;
			$sql="INSERT INTO $table ($cols) VALUES ($_)";
			$db->do($sql);

		}
	}else{
		binmode(FILE);
		my $buff,$data;
		while (read(FILE,$buff,8*2**10)){
			$data.=$buff;
		}
		my @lines=split(/\n/,$data);
		$data="";
		$buff="";
		my @cols=split(/\t/,shift(@lines));
		foreach(@lines){
			$sql="INSERT INTO $table ($cols) VALUES ($_)";
			$db->do($sql);
		}
	}
	close(FILE);
}
sub print_settings_backup{
	my $page = new hfparser(
		DATA=>$settings_shabl,
		ERROR_AFTER_INPUT=>0
	);
	my @tables=map{"${PREF}$_"}@backup_tables;
	if ($PAR{issubmit}=1){
		if ($PAR{backup}){
			if($PAR{filename}=~/[^a-zA-Z0-9_-]/){
				$page->set_error('filename', $LNG{ERROR_FILENAME_INCORRECT});
			}
			if(length($PAR{filename})<4){
				$page->set_error('filename', $LNG{ERROR_SHORTER_THEN_3});
			}

			unless ($page->is_error()){
				create_backup($PAR{filename});
			}
		}
		if ($PAR{'unlink'}){
			my @files=$q->param("unlinkcheck");
			foreach my $file(@files){
				next if($file=~/[^a-zA-Z0-9_-]/);
				my $filename="$glbackupdir/$file";
				remove_dir($filename) if (-d $filename);
				unless ($^O=~/win/i){
					$filename=$filename.'.tar.gz';
					unlink($filename) || die ("$LNG{ERROR_CANT_UNLINK_FILE} $filename $!");
				}
			}

		}
		if ($PAR{'restore'}){
			if($PAR{rest}){
				chdir($glbackupdir);
				my $backup=$PAR{rest};
				unless($^O=~/win/i){
					`gunzip < $backup.tar.gz | tar xvf -` if (-f "$backup.tar.gz");
					unless (-d $backup){
						$page->set_error('none',"Files was not unpacked from $backup.tar.gz");
					}
				}
				foreach my $table(@tables){
					$page->set_error($table, "The file $table.dmp is not exist on backup directory $backup probably table prefix was changed.") unless (-f "$backup/$table.dmp");
				}
				unless ($page->is_error()){
					$page->add_regesp("{error}",qq{<h1 class="mess">Database was restored from backup - $backup</h1>});
					my $path;
					if($ENV{PATH_TRANSLATED}){ 
						$path="$ENV{PATH_TRANSLATED}";
				 	}elsif($ENV{SCRIPT_FILENAME}){
						$path="$ENV{SCRIPT_FILENAME}";
					}
					my $delm;
					$delm='/' if $path=~/\//;
					$delm='\\' if $path=~/\\/;
					my @path=split(/\/|\\/,$path);
					$path=join($delm, @path[0..@path-2]);
					#my $path=$ENV{SCRIPT_FILENAME};
					#my @path=split(/\//,$path);
					#$path=join("\/", @path[0..@path-2]);
					foreach $table(@tables){
						my $filename="$path${delm}$glbackupdir${delm}$backup${delm}$table.dmp"; 
						LoadTableFromFile($table,$filename);
					}
					#save_config(0,"adminpwd",$CONF{adminpwd});
					unless ($^O=~/win/i){
						remove_dir("$backup");
					}					
				}
				chdir('..');				
			}
		}
	}
	opendir(DIR,$glbackupdir);
	my @backups;
	while(my $file=readdir(DIR)){
		next if ($file=~/^\.+$/);
		unless ($^O=~/win/i){
			if ($file=~/(.*)\.tar\.gz/){
				push(@backups,$1);
			}
		}else{
			if (-d "$glbackupdir/$file"){
				push(@backups,$file);
			}
		}
	}
	my $BACKUP="";
	foreach my $name(@backups){
		my $filename="$glbackupdir/$name";
		$filename=$filename.'.tar.gz' unless ($^O=~/win/i);
		my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks)= stat $filename;
		my $time=localtime($ctime);
		if ($^O=~/win/i){
			$size=get_dir_size("$glbackupdir/$name");
		}
		$BACKUP.=<<ALL__;
                      <tr class="data"> 
                        <td width="7%" align="center"><INPUT type="checkbox" name="unlinkcheck" value="$name"></td>
                        <td width="30%" align="center">$name</td>
                        <td width="6%" align="center"><INPUT type="radio" name="rest" value="$name"></td>
                        <td width="24%" align="center"><NOBR>$time</NOBR></td>
                        <td width="33%" align="center">$size</td>
                      </tr>
ALL__

	}
	$page->add_regesp('{BACKUP}',$BACKUP);
	$page->SplitData("#begin#backup","#end#backup");
	$page->deleteBEFORE_AFTER();
	unless($BACKUP){
		$page->SplitData("<!--HIDE_START-->","<!--HIDE_END-->");
		$page->replaceINSIDE("");
	}
#$page->add_regesp("{mess_hour}",sprintf("%4d",$PAR{messcount}/$sec*60*60));				
	$page->ParseData;		
	return $page->as_string;		
}
#############Backup
################
sub print_settings_test{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	$page->add_regesp("{conf_mail}",$CONF{modsend});			
	if ($PAR{issubmit}){
		unless($PAR{emailtest}){
			$page->set_error("emailtest",$LNG{ERROR_REQUIRED});
		}else{
			unless(checkemail($PAR{emailtest})){
				$page->set_error("emailtest",$LNG{ERROR_EMAIL_INCORRECT});				
			}
		}
		unless($PAR{messcount}){
			$page->set_error("messcount",$LNG{ERROR_REQUIRED});
		}else{
			if ($PAR{messcount}=~/[^0-9]/){
				$page->set_error("messcount","digits only");
			}elsif($PAR{messcount}>300){
				$page->set_error("messcount","300 is maximum");
			}elsif($PAR{messcount}<30){
				$page->set_error("messcount","30 is minimum");
			}
		}
	}
	if ($PAR{issubmit} && !$page->is_error()){
		my $starttime=time();
		my $DATA=<<ALL__;

This is a performance test message.

  $ENV{SERVER_ADMIN}
  $ENV{HTTP_HOST}
  $ENV{REMOTE_ADDR}
ALL__
		
		$msg = new MIME::Lite 
			From    =>"$CONF{adminname} <$CONF{adminemail}>",
			To      =>" <$PAR{emailtest}>",
			Subject =>"Performance test message",
			Data    =>$DATA;

		foreach(1..$PAR{messcount}){
			MIMEsendto($PAR{emailtest},$msg);
		}
		my $endtime=time();
		my $sec=$endtime-$starttime;
		$sec=1 unless $sec;
		$page->SplitData("#begin#testresult","#end#testresult");
		$page->deleteBEFORE_AFTER();
		$page->add_regesp("{messcount}",$PAR{messcount});
		$page->add_regesp("{emailtest}",$PAR{emailtest});		
		$page->add_regesp("{seconds}",$sec);
		$page->add_regesp("{mess_sec}",sprintf("%4d",$PAR{messcount}/$sec));
		$page->add_regesp("{mess_min}",sprintf("%4d",$PAR{messcount}/$sec*60));		
		$page->add_regesp("{mess_hour}",sprintf("%4d",$PAR{messcount}/$sec*60*60));				
		$page->ParseData;		
		return $page->as_string;		
		
	}else{
		$page->SplitData("#begin#test","#end#test");
		$page->deleteBEFORE_AFTER();
		$page->set_def("emailtest",$CONF{adminemail});		
		$page->set_input("messcount",{size=>3,maxlength=>3});
		$page->set_def("messcount",50);
		$page->ParseData;
		return $page->as_string;
	}
}
################
sub print_settings_log{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	$page->SplitData("#begin#log","#end#log");
	$page->deleteBEFORE_AFTER();
	if ($PAR{issubmit}){
		save_config(0,"enablelog",$PAR{enablelog});
		if($PAR{cleanall}){
			$db->do("DELETE FROM ${PREF}log");
			&Error;
		}
		if($PAR{cleandate}){
			my $WHERE="WHERE date BETWEEN ".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}")." AND DATE_ADD(".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}").", INTERVAL 1 DAY)";
			$db->do("DELETE FROM ${PREF}log $WHERE");
			&Error;
		}
	}
	#DATE
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME);
	$year+=1900;$mon++;
	foreach (1..31){
		my $dd=sprintf("%02d",$_);
		$page->add_element("day1",$_,$dd);
		$page->add_element("day2",$_,$dd)
	}
	$page->set_def("day1",$mday);	$page->set_def("day2",$mday);
	my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12});
	foreach (1..12){
		$page->add_element("month1",$_,$month[$_-1]);$page->add_element("month2",$_,$month[$_-1]);
	}
	$page->set_def("month1",$mon);	$page->set_def("month2",$mon);
	foreach (2002..$year){
		$page->add_element("year1",$_);
		$page->add_element("year2",$_);
	}
	$page->set_def("year1",$year);	$page->set_def("year2",$year);
	#END DATE
	$page->set_def("enablelog",$CONF{enablelog});
	my @WHERE=();
	if ($PAR{issubmit}){
		if ($PAR{usedate}){
			push(@WHERE,"date BETWEEN ".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}")." AND DATE_ADD(".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}").", INTERVAL 1 DAY)");
		}
	}else{
		push(@WHERE,"date BETWEEN '$year-$mon-$mday' AND DATE_ADD('$year-$mon-$mday', INTERVAL 1 DAY)");
	}
	my $WHERE=join(" AND ",@WHERE);
	$WHERE="WHERE ".$WHERE if $WHERE;
	my $logdata;
	my $sql="SELECT * FROM ${PREF}log $WHERE ORDER by pk_log ASC";
	my $out=$db->prepare($sql);
	$out->execute();
	&Error($sql);
	unless ($out->rows()){
		$logdata.=<<ALL__;
                <tr class="data"> 
                  <td align="center" class="data" colspan=2><b>No logs found</b></td>
                </tr>
ALL__
	}
	while (my %output=%{$out->fetchrow_hashref}){
		$logdata.=<<ALL__;
                <tr class="data"> 
                  <td width="15%" align="right" class="data"><b><NOBR>$output{date}</NOBR></b></td>
                  <td width="54%" align="left">${\&sequre($output{log})}</td>
                </tr>
ALL__
	}
	
	$page->add_regesp('{allcountlog}',GetSQLCount("SELECT * FROM ${PREF}log"));
	$page->add_regesp('{logdata}',$logdata);
	$page->ParseData;
	return $page->as_string;
}
################
sub print_settings{
	my %map;
	%map=(	""       =>\&print_settings_main,
		personal  =>\&print_settings_personal,
		smtp     =>\&print_settings_smtp,
		pass     =>\&print_settings_pass,
		timecorr    =>\&print_settings_timecorr,
		test    =>\&print_settings_test,
		backup    =>\&print_settings_backup

	);
	$main_page=new dparser(
		DATA=>"$SHABL_DIR/main-settings.html"
	);
	$main_page->add_regesp('{main_menu}',get_account_menu(\@SETTINGSMENU));
	my $func_ref;
	if ($map{$PAR{act2}}) {
		$func_ref=$map{$PAR{act2}};
	}else{
		$func_ref=sub{return $q->h1("Please do not experiment with URL")}
	}
	$main_page->add_regesp('###TITLE###',$LNG{GLOBAL_SETTS});
	$main_page->add_regesp('{body}',&$func_ref);
	$main_page->ParseData;
	&printheader;
	$main_page->print;	
}
################
##STAT
##############
sub print_stat_main{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	$page->SplitData("#begin#main","#end#main");
	$page->deleteBEFORE_AFTER();
	$page->add_regesp('{main_menu_body}',get_full_menu(\@STATMENU));
	$page->ParseData;
	return $page->as_string;
}
sub print_stat_curlog{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	$page->SplitData("#begin#broadcastlog","#end#broadcastlog");
	$page->deleteBEFORE_AFTER();
	$page->add_regesp('{mess}',"");
	$page->add_regesp('{broadcast_file}',$BroadcastLogFile);
	$page->add_regesp('{count_rows}',GetSQLCount("SELECT * FROM ${PREF}brodcastlog"));
	if($PAR{issubmit}){
		if($PAR{save_broadcast_log}){
			if(open(FILE,">>$BroadcastLogFile")){
				unless ($^O=~/win/i){
					unless(flock(FILE, LOCK_EX())){
						$page->set_error("save_broadcast_log", "$LNG{ERROR_CANT_LOCK_FILE} ".LOCK_EX()." $!\n");
						close(FILE);
						
					}else{
						print FILE "Broadcast logging starts at ".GetDate()."\n";
						print FILE "TIME\tPROCESS NUMBER\tPID\tSTATUS MESSAGE\n";
						close(FILE);
					}				
				}else{
						print FILE "Broadcast logging starts at ".GetDate()."\n";
						print FILE "TIME\tPROCESS NUMBER\tPID\tSTATUS MESSAGE\n";
						close(FILE);
				}
			}else{
				$page->set_error("save_broadcast_log", "$LNG{ERROR_CANT_OPEN_FILE} $BroadcastLogFile $LNG{ERROR_CANT_WRITE} ($!) <BR> $LNG{ERROR_NEED_TO_CREATE} $BroadcastLogFile $LNG{ERROR_NEED_TO_CREATE2}");
			}
		}
		unless($page->is_error){
			$page->add_regesp('{mess}',"<H1 class=mess>$LNG{MESS_SETTINGS_UPDATED}</H1>");				
			save_config(0,"save_broadcast_log",$PAR{save_broadcast_log});
		}
	}
	$page->set_def("save_broadcast_log",$CONF{save_broadcast_log});	
	my $mess = "";
	my $sql="SELECT DATE_FORMAT(date, '%Y-%b-%d &nbsp;&nbsp; %H:%i:%S' ) as datelog, pid,log,procnomber FROM  `${PREF}brodcastlog` ORDER by `date` ASC";
	my $out=$db->prepare($sql);
	$out->execute;
	&Error;
	unless($out->rows()){
		$mess.=qq|<h1 class="mess"> $LNG{MESS_NO_BROADCAST_LOG}</h1>|;
	}else{
		my $count=$out->rows();
		$mess.=<<ALL__;
<table border="0" align="center" width="70%" cellspacing="1" cellpadding="2">
 <tr class="dataheader"> 
 <td width="5%"><NOBR>$LNG{BROADCAST_LOG_PROC}</NOBR></td>
 <td width="10%"><NOBR>PID</NOBR></td>
 <td width="20%"><NOBR>$LNG{BROADCAST_LOG_TIME}</NOBR></td>
 <td width="65%"><NOBR>$LNG{BROADCAST_LOG_STATUS}</NOBR></td>
</tr>
ALL__
		while (my $output=$out->fetchrow_hashref){
			$output->{procnomber}="<B>$LNG{BROADCAST_LOG_MAIN}</B>" unless $output->{procnomber};
				$mess.=<<ALL__;
 <tr class="data"> 
 <td width="5%" align=center>$output->{procnomber}</td>
 <td width="10%" align=center><B>$output->{pid}</B></td>
 <td width="20%"><NOBR>$output->{datelog}</NOBR></td>
 <td width="65%">$output->{log}</td>
</tr>
ALL__
		}
		$mess.="</table>";	
	}
	$page->add_regesp('{broadcast_mess}',$mess);
	$page->ParseData;
	return $page->as_string;	
}
sub set_leng{
	my $out=<<ALL__;
<table width="100%" border="0" cellspacing="0" cellpadding="0" height="80%">
  <tr>
    <td valign="middle">
<form name="form1" method="POST" action="{ME}" target="_top">
  {error}{fm_hidden_ses}{fm_hidden_act} 
  <input type="hidden" name="issubmit" value="1">
  <table width="50%" border="0" cellspacing="3" cellpadding="4" align="center">
    <tr class="dataheader"> 
      <td colspan="2"><b>[LNG_LANG_SELECT_LANG_TABHEADER]</b></td>
    </tr>
    <tr class="data"> 
      <td width="48%" align="right" class="data"><b>[LNG_LANG_LANG]:</b></td>
      <td width="52%"><div align="left">{fm_select_langnow}</div></td>
    </tr>
    <tr class="data" align="center"> 
      <td colspan="2"> 
      <input type="submit" value="Save lang" class="BUTTONmy" name="submit">
      </td>
    </tr>
  </table>
</form></td></tr></table>
ALL__
	if($PAR{issubmit} and $PAR{langnow}){
		save_config(0,'langnow',$PAR{langnow});
		print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}");
		exit;
	}
	my $page=new hfparser(
		IS_CRIPT=>0,
		SOURCE=>'string',
		DATA=>$out
	);
#	my @files=<"shabl/lang/*.txt">;
	my $lang_dir='shabl/lang';
	opendir(DIR,$lang_dir);
	my @backups;
	while(my $file=readdir(DIR)){
		next unless $file=~/\.txt$/;
		$file=~s/\.txt$//;
		open(FILE,"$lang_dir/$file.txt");
		my $fline=<FILE>;
		close(FILE);
		chomp($fline);
		my ($lang_name,$lengencod)=split(/\t/,$fline);
		$page->add_element('langnow',$file,"$lang_name ($lengencod)");
	}
	closedir(DIR);
	$page->set_def('langnow',$CONF{langnow});
	$page->ParseData;
	return $page->as_string;
	
}
#################
sub print_set_leng{
	$main_page=new dparser(
		DATA=>"$SHABL_DIR/main-settings.html"
	);
	$main_page->add_regesp('###TITLE###',$LNG{LANG_SELECT_LANG});
	$main_page->add_regesp('{body}',set_leng());
	$main_page->add_regesp('{main_menu}',"");
	$main_page->ParseData;
	&printheader;
	$main_page->print;
		
}
#################
sub print_stat{
	my %map;
	%map=(	""       =>\&print_stat_main,
		curlog  =>\&print_stat_curlog,
		'log'    =>\&print_settings_log,
		total    =>\&print_stat_total,
	);
	$main_page=new dparser(
		DATA=>"$SHABL_DIR/main-settings.html"
	);
	my $func_ref;
	if ($map{$PAR{act2}}) {
		$func_ref=$map{$PAR{act2}};
	}else{
		$func_ref=sub{return $q->h1($LNG{ERROR_NOT_CHANGE_URL})}
	}
	$main_page->add_regesp('###TITLE###',$LNG{STAT_STATISTICS});
	$main_page->add_regesp('{body}',&$func_ref);
	$main_page->add_regesp('{main_menu}',
		get_hor_menu(\@STATMENU,{ses=>$PAR{ses},act=>$PAR{act}},[['menu','menuACT'],['menu2','menu2ACT']])
		);
	$main_page->ParseData;
	&printheader;
	$main_page->print;	
}

sub print_stat_account{
	my $page=shift;
	$page->add_regesp('{log_header}',$LNG{STAT_TOTAL_PROSP});
	$page->Hide("<!--HIDE_PERIOD-->");
	my $sql="select * from ${PREF}account";
	my $out=$db->prepare($sql);
	$out->execute();
	my %accountname;
	while (my %output=%{$out->fetchrow_hashref}){
		$accountname{$output{pk_account}}=$output{name};
	}
	my $Total_act,$Total_inact;
my $logdata.=<<ALL__;
<table border="0" align="center" width="60%" cellspacing="1" cellpadding="2">
 <tr class="dataheader"> 
 <td >$LNG{STAT_ACCOUNT}</td>
 <td >$LNG{STAT_ACT_PROSP}</td>
 <td >$LNG{STAT_INACT_PROSP}</td>
 <td >$LNG{STAT_TOTAL}</td>
</tr>
ALL__
	foreach my $account_id(sort {$accountname{$a} cmp $accountname{$b}}keys %accountname){
		my $total_activ   = GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND  isact=1",$account_id);
		my $total_inactiv = GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND  isact<>1",$account_id);
		my $total=$total_activ+$total_inactiv;
		$Total_act+=$total_activ;
		$Total_inact+=$total_inactiv;
		$logdata.=<<ALL__;
 <tr class="data" align="right"> 
 <td align="left"><a href="$SCRIPT_NAME?act=mainbody&account=$account_id&ses=$PAR{ses}">$accountname{$account_id}</a></td>
 <td >$total_activ</td>
 <td >$total_inactiv</td>
 <td >$total</td>
</tr>	
ALL__
		
	}
	my $tot=$Total_inact+$Total_act;
	$logdata.=<<ALL__;
 <tr class="data" align="right"> 
 <td align="left"><b>$LNG{STAT_TOTAL}:</b></td>
 <td ><b>$Total_act</b></td>
 <td ><b>$Total_inact</b></td>
 <td ><b>$tot</b></td>
</tr>	
</table>
ALL__
 $logdata.=get_gif_link();
	$page->add_regesp('{logdata}',$logdata);
	$page->ParseData;
	return $page->as_string;
}
sub get_gif_link{
	my $script=$SCRIPT_NAME;
	my @chars=('a'..'z','A'..'Z',0..9,'_');
	my $ran=join("", @chars[map{rand @chars}(1..8)]);
	$script=~s/responder\.cgi/logpng.cgi/;
	$script.="?rn=$ran&".join("&",map{"$_=$PAR{$_}"}keys %PAR);
	return qq|<DIV align="center"><IMG src="$script" hspace="5" vspace="5" alt="Diagram"></DIV>|;
}
sub print_stat_total{
	my $page = new hfparser(
		DATA=>$settings_shabl		
	);
	$page->SplitData("#begin#total","#end#total");
	$page->deleteBEFORE_AFTER();
	if ($PAR{modelog} eq 'account'){
		return print_stat_account($page);
	}
	#DATE
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME);
	$year+=1900;$mon++;
	$PAR{year1}=$year unless $PAR{year1};
	$PAR{year2}=$year unless $PAR{year2};
	$PAR{month1}=$mon unless $PAR{month1};
	$PAR{month2}=$mon unless $PAR{month2};
	$PAR{day1}=$mday unless $PAR{day1};
	$PAR{day2}=$mday unless $PAR{day2};
	foreach (1..31){
		my $dd=sprintf("%02d",$_);
		$page->add_element("day1",$_,$dd);
		$page->add_element("day2",$_,$dd)
	}
	$page->set_def("day1",$PAR{day1});
	$page->set_def("day2",$PAR{day2});
	my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12});
	foreach (1..12){
		$page->add_element("month1",$_,$month[$_-1]);$page->add_element("month2",$_,$month[$_-1]);
	}
	$page->set_def("month1",$PAR{month1});
	$page->set_def("month2",$PAR{month2});
	foreach (2002..$year){
		$page->add_element("year1",$_);
		$page->add_element("year2",$_);
	}
	$page->set_def("year1",$PAR{year1});
	$page->set_def("year2",$PAR{year2});
	#END DATE
	$page->set_def("enablelog",$CONF{enablelog});
	my @WHERE=();
	push @WHERE, "`date` >=".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}");
	push @WHERE, "`date` <=".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}");	
	my $WHERE=join(" AND ",@WHERE);
	$WHERE="WHERE ".$WHERE if $WHERE;
	my $logdata;
	my $sql=<<ALL__;
SELECT  `name`,`pk_account` ,    
SUM(`subscribers`) as subscribers ,  
SUM(`unsubscribers`) as unsubscribers,
SUM(`sent_manual`) as `sent_manual`,
SUM(`sent_sheduled`) as `sent_sheduled`,
SUM(`sent_sequential`) as `sent_sequential` ,
SUM(`sent_subscribe`) as `sent_subscribe`,
SUM(`sent_unsubscribe`) as `sent_unsubscribe` ,
SUM(`sent_doubleoptin`) as `sent_doubleoptin` ,
SUM(`sent_manual`)+SUM(`sent_sheduled`)+SUM(`sent_sequential`)+SUM(`sent_subscribe`)+SUM(`sent_unsubscribe`) as total_sent,
SUM(`subscribers`)-SUM(`unsubscribers`) as  total_subscribers
FROM  `${PREF}stat_account_dayly` 
RIGHT JOIN ${PREF}account ON pk_account=fk_account
$WHERE 
GROUP BY fk_account
ALL__
unless($PAR{modelog}){
$sql.=" HAVING total_sent<>0 ORDER by total_sent DESC ";
}else{
$sql.=" HAVING subscribers<>0 OR unsubscribers<>0 ORDER by total_subscribers DESC";
}
	
	my $out=$db->prepare($sql);
	$out->execute();
	&Error($sql);
	unless ($out->rows()){
		$logdata.=<<ALL__;
		<H1 class=mess>$LNG{STAT_NO_LOGS_FOUND}</H1>
ALL__
	}else{
		unless($PAR{modelog}){
$logdata.=<<ALL__;
<table border="0" align="center" width="100%" cellspacing="1" cellpadding="2">
 <tr class="dataheader"> 
 <td ><NOBR>$LNG{STAT_ACCOUNT}</NOBR></td>
 <td >$LNG{STAT_SEQUNTIAL}</td>
 <td >$LNG{STAT_SHEDULED}</td>
 <td >$LNG{STAT_MANUAL}</td>
 <td ><NOBR>$LNG{STAT_DOI}</NOBR></td>
 <td >$LNG{STAT_SUBSCRIBE}</td>
 <td >$LNG{STAT_UNSUBSCRIBE}</td>
 <td >$LNG{STAT_TOTAL}</td>
</tr>
ALL__
		}else{
$logdata.=<<ALL__;
<table border="0" align="center" width="50%" cellspacing="1" cellpadding="2">
 <tr class="dataheader"> 
 <td >$LNG{STAT_ACCOUNT}</td>
 <td >$LNG{STAT_SUBSCRIBERS}</td>
 <td >$LNG{STAT_UNSUBSCRIBERS}</td>
 <td >$LNG{STAT_TOTAL}</td>
</tr>
ALL__
		}
		
		my %itog;
		
		while (my $output=$out->fetchrow_hashref){
			map{$itog{$_}=$itog{$_}+$output->{$_} unless(/account|name/)}keys %{$output};
			unless($PAR{modelog}){
			$logdata.=<<ALL__;
 <tr class="data" align="right"> 
 <td align="left"><a href="$SCRIPT_NAME?act=mainbody&account=$output->{pk_account}&ses=$PAR{ses}">$output->{name}</a></td>
 <td >$output->{sent_sequential}</td>
 <td >$output->{sent_sheduled}</td>
 <td >$output->{sent_manual}</td>
 <td >$output->{sent_doubleoptin}</td>
 <td >$output->{sent_subscribe}</td>
 <td >$output->{sent_unsubscribe}</td>
 <td >$output->{total_sent}</td>
</tr>
ALL__
			}else{
			$logdata.=<<ALL__;
 <tr class="data" align="right"> 
 <td align="left"><a href="$SCRIPT_NAME?act=mainbody&account=$output->{pk_account}&ses=$PAR{ses}">$output->{name}</a></td>
 <td >$output->{subscribers}</td>
 <td >$output->{unsubscribers}</td>
 <td >$output->{total_subscribers}</td>
</tr>
ALL__
			}
		}
			unless($PAR{modelog}){
			$logdata.=<<ALL__;
 <tr class="data" align="right"> 
 <td align="left"><b>$LNG{STAT_TOTAL}</b></td>
 <td ><b>$itog{sent_sequential}</b></td>
 <td ><b>$itog{sent_sheduled}</b></td>
 <td ><b>$itog{sent_manual}</b></td>
 <td ><b>$itog{sent_doubleoptin}</b></td>
 <td ><b>$itog{sent_subscribe}</b></td>
 <td ><b>$itog{sent_unsubscribe}</b></td>
 <td ><b>$itog{total_sent}</b></td>
</tr>	
</table>
ALL__
		}else{
			$logdata.=<<ALL__;
 <tr class="data" align="right"> 
 <td align="left"><b>$LNG{STAT_TOTAL}</b></td>
 <td ><b>$itog{subscribers}</b></td>
 <td ><b>$itog{unsubscribers}</b></td>
 <td ><b>$itog{total_subscribers}</b></td>
</tr>	
</table>
ALL__
		}
$logdata.=get_gif_link();
}
	my $header;
	my $m1=$month[$PAR{month1}-1];
	my $m2=$month[$PAR{month2}-1];
	my $period;
	if ($m1 eq $m2 && $PAR{day1} == $PAR{day2} && $PAR{year1}==$PAR{year2}){
		$period = "$LNG{STAT_PERIOD_FOR} $PAR{day1} $m1 $PAR{year1}";
	}else{
		$period = "$LNG{STAT_PERIOD_FROM} $PAR{day1} $m1 $PAR{year1} $LNG{STAT_PERIOD_TILL} $PAR{day2} $m2 $PAR{year2}";
	}
	
	unless($PAR{modelog}){
		$header="$LNG{STAT_SENT_MESS_STAT} $period";
	}else{
		$header="$LNG{STAT_SUBSCRIBERS_STAT} $period";
	}
	$page->add_regesp('{log_header}',"$header");
	$page->add_regesp('{logdata}',$logdata);
	$page->ParseData;
	return $page->as_string;
}
#################
#################
##ACCOUNT
#################
#################
#USERS
#################
sub print_user_form{
	local @FIELDS;
	@FIELDS=load_account_fields($PAR{account});
	my $page = new hfparser(
		DATA=>$main_shabl,
		ERROR_AFTER_INPUT=>1
	);	
	if ($PAR{issubmit}){
		#SET ERROR
		$page->set_error("email",$LNG{ERROR_EMAIL_INCORRECT}) unless checkemail($PAR{email});
	        $page->set_error("email","$LNG{TXT_EMAIL_ADDRESS} <B>$PAR{email}</b>  $LNG{ERROR_IS_ALREADY_EXISTS}")		
		  if GetSQLCount("SELECT * from ${PREF}user where fk_account=? AND email=? AND pk_user<>?",$PAR{account},$PAR{email},$PAR{reckey});
		unless($page->is_error){
			if($CONF{useblacklist}){
				$page->set_error("email",$CONF{blacklist_error}) if GetSQLCount("SELECT * FROM ${PREF}bounce_banemails WHERE email=?",$PAR{email});
			}
	  	}  
		if ($PAR{days}=~/[^0-9]/){
			$page->set_error("days",$LNG{ERROR_NUMBER_REQUIRED});
		}  
		$PAR{days}=0 unless $PAR{days};
		unless($page->is_error){
			my $last;
			my $days;
			$days=$PAR{days};			
			unless($PAR{reckey}){
				#$last=GetLastInsert("${PREF}user");
				if ($PAR{add_to} eq 'no_seq'){
					$days=-1;	
				}
				#$db->do("INSERT INTO ${PREF}user (fk_account,name,email,days,datereg) VALUES (?,?,?,?,$NOW)",undef,$PAR{account},$PAR{name},$PAR{email},$days);
				$last=insert_db("${PREF}user",{fk_account=>$PAR{account},name=>$PAR{name},email=>$PAR{email},days=>$days},{datereg=>"$NOW"});
				&Error;
			}else{
				#update user
				if ($PAR{add_to} eq 'no_seq'){
					$days=-1;	
				}				
				update_db("${PREF}user",{fk_account=>$PAR{account},name =>$PAR{name},email=>$PAR{email},days=>$days},{pk_user=>$PAR{reckey}});
				$last=$PAR{reckey};
			}
			
			foreach(@FIELDS){
				my $param="dp".$_->{key};
				save_user_parametr($_->{key},$last,$PAR{$param});
			}
			print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=users&account=$PAR{account}");
			exit(1);
		}
	}
	#set defaults
	if ($PAR{reckey}){
		$page->add_regesp('{mode}', $LNG{TXT_MODE_EDIT});
		$val=select_one_db("SELECT * from ${PREF}user WHERE pk_user=? and fk_account=?",$PAR{reckey},$PAR{account}) 
		  || die $LNG{ERROR_USER_NOT_FOUND};
		$page->set_def('email',$val->{email});
		$page->set_def('name',$val->{name});
		if($val->{days}==-1){
			$page->set_def('days',0);
			$page->add_regesp("{CHECKED_no_seq}",' CHECKED ');
		}else{
			$page->set_def('days',$val->{days});
			$page->add_regesp("{CHECKED_yes_seq}",' CHECKED ');
		}
		foreach (@FIELDS){
			$page->set_def('dp'.$_->{key},get_user_parametr($_->{key},$PAR{reckey}));
		}
	}else{
		$page->add_regesp("{CHECKED_yes_seq}",' CHECKED ');
		$page->set_def('days',0);
		$page->add_regesp('{mode}', $LNG{TXT_MODE_NEW});
	}
	my $add;
	foreach (@FIELDS){
		$add.=<<ALL__;
		<TR class="data">
		<td align="right"><b>$_->{name}:</b></td>
		<TD>{fm_$_->{type}_dp$_->{key}}</TD></TR>
ALL__
	}
	add_menu_prospects($page);
	$page->add_regesp("{LOGMESS}",&GetUserMessLog($PAR{reckey}));
	$page->ChangeData('{additional_fields}',$add);
	$page->SplitData("#begin#user_form","#end#user_form");
	$page->deleteBEFORE_AFTER();
	$page->set_default_input("text","size",35);
	$page->set_default_input("textarea","rows",4);
	$page->set_default_input("textarea","columns",35);
	$page->set_input("days",{size=>3,maxlength=>3});
	$page->ParseData;
	return $page->as_string;
}
#############
sub GetUserMessLog{
	my $user=shift;
	return unless ($user);
	my $data="";
	return unless $CONF{messlogging};	
	my $sql="SELECT * FROM ${PREF}sentlog WHERE fk_user=? ORDER BY date ASC";
	my $out=$db->prepare($sql);
	$out->execute($user);
	&Error($sql);
	return unless ($out->rows());
	my $rows=$out->rows;
	$data.=<<ALL__;
	<h2>$LNG{USR_SENT_MESS}: $rows $LNG{USR_SENT_RECORDS_IN_LOGS}</h2>
<table width="70%" border="0" cellspacing="3" cellpadding="4" align="center">
      <tr class="dataheader"> 
        <td width="5%">&nbsp;&nbsp;</td>
	<td width="70%"> $LNG{USR_SENT_MESSAGE} </td>
	<td width="25%"> $LNG{USR_SENT_DATE} </td>
      </tr>
ALL__
	my $i;
	while (my %output=%{$out->fetchrow_hashref}){
		$i++;
		my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE pk_mess=?",$output{fk_mess});
		my $subj=sequre($mess->{subject});
		$data.=<<ALL__;
      <tr class="data"> 
        <td width="5%">$i</td>
	<td width="70%">$subj</td>
	<td width="25%"><NOBR>$output{date}</NOBR></td>
      </tr>
ALL__
	
	}
	$data.=<<ALL__;
	</TABLE>
ALL__
	
	return $data;
}
#############
sub print_user_browser{
	my $OUT;
	my $TEXT_FILE;
	my @showfields=$q->param("showfields");
	my @showadditional=$q->param("additional");
	my %FIELDS;
	map{$FIELDS{$_->{key}}=$_->{name}}@FIELDS;
	my @addtextfield=map{"$FIELDS{$_}"}@showfields;
	my @addtextextra=map{"$summary{$_}"}@showadditional;
	
	my @addtdfield=map{"<TD><NOBR>$FIELDS{$_}</NOBR></TD>"}@showfields;
	my @addtdextra=map{"<TD><NOBR>$summary{$_}</NOBR></TD>"}@showadditional;
	my @WHERE=();
	my $ORDER, $LEFTJ;
	push(@WHERE,"fk_account=".$db->quote($PAR{account}));
	if ($PAR{usedate}){
		push(@WHERE,"datereg BETWEEN ".$db->quote("$PAR{year1}-$PAR{month1}-$PAR{day1}")." AND ".$db->quote("$PAR{year2}-$PAR{month2}-$PAR{day2}"));
	}
	$PAR{doprar}="email" unless($PAR{doprar});
	$PAR{ordertype}="ASC" unless($PAR{ordertype});
	if (($PAR{doprar} eq "email") or ($PAR{doprar} eq "name")){
		$ORDER = "ORDER by $PAR{doprar} $PAR{ordertype}";
		push(@WHERE,"$PAR{doprar} LIKE ".$db->quote("%".$PAR{search}."%")) if ($PAR{search} ne "");
	}else{
		$LEFTJ="LEFT JOIN ${PREF}doppar ON fk_user=pk_user AND fk_fields=$PAR{doprar}";	
		$ORDER = "ORDER by value $PAR{ordertype}";
		push(@WHERE,"value LIKE ".$db->quote("%".$PAR{search}."%")) if ($PAR{search} ne "");
	}
	if ($PAR{filter} eq "act"){
		push(@WHERE, "isact=1");
	}elsif($PAR{filter} eq "dis"){
		push(@WHERE, "isact=0");	
	}elsif($PAR{filter} eq "ec"){
		if(@messdays){
			my $lastid=$messdays[scalar(@messdays)-1];
			push(@WHERE, "messlastsend=$lastid");	
		}	
	}elsif($PAR{filter} eq "pend"){
		my @pend = @{$db->selectcol_arrayref("select fk_user from ${PREF}doiaccounts")};
		if (@pend){
			push(@WHERE, "pk_user IN (".join(",",@pend) .")");	
		}
	}
	
	my $WHERE;
	if (@WHERE){
		$WHERE="WHERE ".join(" AND ", @WHERE);
	}
	$sql="SELECT * FROM ${PREF}user $LEFTJ $WHERE $ORDER";
	my $i=0;
	my %addt=();
	map{$addt{$_}=1}@showadditional;
	my @addt=();
	foreach(@summary){
		push(@addt,$_) if exists($addt{$_});
	}
	my $allcount=GetSQLCount($sql);
	my $allpages=20;
	$PAR{p2}=1 unless $PAR{p2};
	my $maxpages=20;
	my $pages=ceil($allcount/$PAR{onpage});
	$PAR{page}=1 unless $PAR{page};
	my $alluserscount=GetSQLCount("SELECT * from ${PREF}user WHERE fk_account=?",$PAR{account});
	if ($pages>1){
		my $start=$PAR{onpage}*($PAR{page}-1);
		my $rows=$PAR{onpage};	
		$sql=$sql." LIMIT $start, $rows" unless $PAR{export_to_txt};
		$OUT.="<DIV align = \"left\">$LNG{USR_BROWSER_PAGE} <B>$PAR{page}/$pages</b> ($LNG{USR_BROWSER_PROSPECTS} <B>$PAR{onpage}/$allcount</B>):";
		my $startpage=($PAR{p2}-1)*$maxpages+1;
		my $endpage=$PAR{p2}*$maxpages;
		$endpage=$pages if ($endpage>$pages);
		my $count_pages_pages=ceil($pages/$maxpages);
		$OUT.=" ".$q->a({-href=>get_full_url({page=>($PAR{p2}-2)*$maxpages+1,p2=>$PAR{p2}-1})},"<<[$maxpages]$LNG{USR_BROWSER_PREVIOUSE}")." " if ($PAR{p2} >1);
		foreach($startpage..$endpage){
			$OUT.=" ".$q->a({-href=>get_full_url({page=>$_,p2=>$PAR{p2}})},$_)." " unless ($PAR{page} eq $_);
			$OUT.=" <B>$_</B> " if ($PAR{page} eq $_);
		}
		$OUT.=" ".$q->a({-href=>get_full_url({page=>($PAR{p2})*$maxpages+1,p2=>$PAR{p2}+1})},"$LNG{USR_BROWSER_NEXT}[$maxpages]>>")." " if ($PAR{p2} < $count_pages_pages);
		$OUT.="</DIV>";
	}else{

		if ($allcount == $alluserscount){
			$OUT.= "<H2>$LNG{USR_BROWSER_SHOWING} $alluserscount $LNG{USR_BROWSER_PROSPECTS}</H2>";
		}else{
			$OUT.= "<H2>$LNG{USR_BROWSER_SHOWING} $allcount $LNG{USR_BROWSER_FROM} $alluserscount {USR_BROWSER_PROSPECTS}</H2>";
		}
	}
	#my $my_save_url=repparser::GetURLToExport();
	#$OUT.=qq|<A href="$my_save_url" target="_blank">Save as text...</a>|;
#$page->add_regesp('{sql}',"<BR>$sql<BR>PAGES: $pages");
	$page->add_regesp('{sql}',"");
	my $out=$db->prepare($sql);
	&Error;
	$out->execute();
	&Error;
	unless($out->rows){
		$page->SplitData("<!--START_RESULT-->","<!--END_RESULT-->");
		$page->replaceINSIDE($q->h1($LNG{USR_BROWSER_NO_RECORDS_FOUND}));
		return;
	}
	if($PAR{export_to_txt}){
		$TEXT_FILE="$LNG{STAT_ACCOUNT}:\t$ACCOUNT{$PAR{account}}\r\n$LNG{STAT_TOTAL}:  \t".$out->rows()." $LNG{USR_BROWSER_PROSPECTS}\r\n$LNG{DATE}:   \t".GetDate()."\r\n################################\r\n".join("\t",("#","$LNG{TXT_EMAIL_ADDRESS}","$LNG{TXT_NAME}",@addtextfield,@addtextextra))."\r\n";
	}
	
	$OUT.= <<ALL__;
<table width="100%" border="0" cellspacing="2" cellpadding="2" align="center">
<TR class="dataheader">
<TD>#</TD>
<TD>&nbsp;</TD>
<TD>$LNG{TXT_EMAIL_ADDRESS}</TD>
<TD>$LNG{TXT_NAME}</TD>
@addtdextra
@addtdfield
</TR>
ALL__
$i=$PAR{onpage}*($PAR{page}-1);
while (my %output=%{$out->fetchrow_hashref}){
	$i++;
	map{$output{$_}=sequre($output{$_})}keys %output;
	my %addshow;
	$addshow{status}=$LNG{USR_BROWSER_ACTIVE} if $output{isact};
	$addshow{status}=$LNG{USR_BROWSER_INACTIVE} unless $output{isact};
	if (($addshow{status} eq $LNG{USR_BROWSER_INACTIVE}) and GetSQLCount("SELECT * FROM ${PREF}doiaccounts WHERE fk_user=$output{pk_user}")){
		$addshow{status}=$LNG{USR_BROWSER_PENDING}
	}
	$addshow{pk_user}=$output{pk_user};
	$addshow{regdate}=$output{datereg};
	$addshow{ip}=$output{ip};
	$addshow{sendcount}=$output{countsend};
	$addshow{undelivered}=$output{undelivered};
	$addshow{undelivered}='0' unless $addshow{undelivered};
	$addshow{cycle}=$messdays{$output{messlastsend}}.'/'.scalar(@messdays) unless($output{days}==-1);
	$addshow{cycle}=$LNG{USR_BROWSER_CYCLE_DISABLED} if($output{days}==-1);
	my @addtdextra=map{"<TD align=\"center\"><NOBR>$addshow{$_}</NOBR></TD>"}@addt;
	my @addtdfield=map{"<TD>".get_user_parametr($_,$output{pk_user})."</TD>"}@showfields;
	$USERNAME=$output{name};
	$USERNAME=$CONF{defname} if ($USERNAME eq '');
	if($PAR{export_to_txt}){
		my @addtextfield=map{get_user_parametr($_,$output{pk_user})}@showfields;
		my @addtextextra=map{"$addshow{$_}"}@addt;		
		$TEXT_FILE.=join("\t",($i,$output{email},$USERNAME,@addtextfield,@addtextextra))."\r\n";
	}
	$OUT.= <<ALL__;
<TR class="data">
<TD>$i</TD>
<TD><INPUT type="checkbox" name="sel" value="$output{pk_user}"></TD>
<TD><a href="$SCRIPT_NAME?ses=$PAR{ses}&account=$PAR{account}&act=$PAR{act}&act2=userform&reckey=$output{pk_user}" title="$LNG{USR_BROWSER_EDIT_USER}">$output{email}</a></TD>
<TD><NOBR><a href="$SCRIPT_NAME?ses=$PAR{ses}&account=$PAR{account}&act=$PAR{act}&act2=userform&reckey=$output{pk_user}" title="$LNG{USR_BROWSER_EDIT_USER}">$USERNAME</a></NOBR></TD>
@addtdextra
@addtdfield
</TR>
ALL__
}
$OUT.= <<ALL__;
</TABLE>
ALL__
if($PAR{export_to_txt}){
	#print $q->header('text/plain');
	my $account_name=lc($ACCOUNT{$PAR{account}});
	$account_name=~s/[^a-z0-9_-]//g;
	my  $filename;
	$filename="$account_name.txt" if length($account_name);
	$filename="prospects$PAR{account}.txt" unless length($account_name);
	
	print "Content-type: application/octet-stream\nContent-Disposition: attachment; filename=$filename\n\n";
	print $TEXT_FILE;
	exit;
}
return $OUT;
}
###############
sub print_users{
	local $alluserscount=GetSQLCount("SELECT * from ${PREF}user WHERE fk_account=?",$PAR{account});
	local @FIELDS=load_account_fields($PAR{account});
	local %summary=(sendcount=>$LNG{USR_BROWSER_HEAD_SENT},status=>$LNG{USR_BROWSER_HEAD_STATUS},regdate=>$LNG{USR_BROWSER_HEAD_DATE},cycle=>$LNG{USR_BROWSER_HEAD_CYCLE}, ip=>$LNG{USR_BROWSER_HEAD_HOST}, pk_user=>$LNG{USR_BROWSER_HEAD_USERID}); # to add : undelivered=>"Bounce"
	local @summary=qw(status cycle sendcount regdate ip pk_user); #undelivered
	local @messdays,%messdays;
	$sql="SELECT * FROM ${PREF}mess WHERE fk_account = ? AND typesend = 'auto' ORDER BY days ASC";
	my $out=$db->prepare($sql);
	$out->execute($PAR{account});&Error($SQL);
	my $i=0;
	while (my %output=%{$out->fetchrow_hashref}){
		$i++;
		push @messdays,$output{pk_mess};
		$messdays{$output{pk_mess}}=$i;
	}
	$messdays{""}=0;
	local $page = new hfparser(
		DATA=>$main_shabl,
		ERROR_AFTER_INPUT=>0);
	$page->add_regesp("{mess}","");
	add_menu_prospects($page);
	if ($PAR{bnRemove}){
		my @selected=$q->param("sel");
		if (@selected){
			@selected=map{$db->quote($_)}@selected;
			my $in=join(" , ",@selected);
			my $count=$db->do("DELETE FROM ${PREF}user WHERE pk_user IN ($in)");
			$page->add_regesp("{mess}","<h1 class=\"mess\">$count $LNG{USR_BROWSER_USERS_REMOVED}</h1>");
			$db->do("DELETE FROM ${PREF}doppar WHERE fk_user IN ($in)");
			$db->do("DELETE FROM ${PREF}tosend WHERE fk_user IN ($in)");			
			$db->do("DELETE FROM ${PREF}doiaccounts WHERE fk_user IN ($in)");
			$db->do("DELETE FROM ${PREF}sentlog  WHERE fk_user IN ($in)");
			$db->do("DELETE FROM ${PREF}link_clicks  WHERE fk_user IN ($in)");
			&Error;
		}
	}
	if ($PAR{bnInvStat}){
		my @selected=$q->param("sel");
		if (@selected){
			@selected=map{$db->quote($_)}@selected;
			my $in=join(" , ",@selected);
			my $count=$db->do("UPDATE  ${PREF}user SET isact=IF(isact=0,1,0) WHERE pk_user IN ($in)");
			&Error;
			$page->add_regesp("{mess}","<h1 class=\"mess\" >$count $LNG{USR_BROWSER_USERS_CHANGED}</h1>");
		}
	}
	
	unless($PAR{issubmit}){
	       $q->param(-name=>'onpage',-value=>'50');
       	       $page->set_def("onpage",50);$PAR{onpage}=50;
	       $q->param(-name=>'additional',-value=>[qw(status  cycle sendcount)]);	
		
	}	
	
	$page->add_regesp('{all_users_count}',$alluserscount);
	$page->add_regesp('{result_table}',&print_user_browser);
	$page->add_regesp('{account}',$PAR{account});
	$page->add_element("doprar",'email',"$LNG{TXT_EMAIL_ADDRESS}");	
	$page->add_element("doprar",'name',"$LNG{TXT_NAME}");
	foreach (@FIELDS){
		$page->add_element("doprar",$_->{key},$_->{name});
	}
	foreach (qw(20 30 50 75 100 150 200 300 400)){
		$page->add_element("onpage",$_);
	}
	my $toshow;
	if (@FIELDS){
		$toshow.="<BR><B>$LNG{USR_BROWSER_USERS_SHOW_FIELDS}:</b>";
		my @val=map{$_->{key}}@FIELDS;
		my %lab;
		map{$lab{$_->{key}}="$_->{name}"}@FIELDS;
		$toshow.=$q->checkbox_group(-name=>'showfields',
                                -values=>\@val,
                                -default=>"",
                                -labels=>\%lab);
	}
	my $additional;
	if (%summary){
		$additional.="<B>$LNG{USR_BROWSER_USERS_SHOW_EXTRA}:</b>";
		my @val=@summary;
		map{$_->{key}}@FIELDS;
		$additional.=$q->checkbox_group(-name=>'additional',
                                -values=>\@val,
                                -default=>"",
                                -labels=>\%summary);
	}
	$page->add_regesp('{additional}',$additional);
	$page->add_regesp('{toshow_line}',$toshow);
	$page->add_element("ordertype","ASC",$LNG{USR_BROWSER_USERS_SORT_ASC});
	$page->add_element("ordertype","DESC",$LNG{USR_BROWSER_USERS_SORT_DESC});	
	#DATE
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME);
	$year+=1900;$mon++;
	foreach (1..31){
		my $dd=sprintf("%02d",$_);
		$page->add_element("day1",$_,$dd);
		$page->add_element("day2",$_,$dd)
	}
	$page->set_def("day1",$mday);	$page->set_def("day2",$mday);
	my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12});
	foreach (1..12){
		$page->add_element("month1",$_,$month[$_-1]);$page->add_element("month2",$_,$month[$_-1]);
	}
	$page->set_def("month1",$mon);	$page->set_def("month2",$mon);
	foreach (2002..$year){
		$page->add_element("year1",$_);
		$page->add_element("year2",$_);
	}
	$page->set_def("year1",$year);	$page->set_def("year2",$year);
	$page->add_element("filter","",$LNG{USR_BROWSER_ALL});
	$page->add_element("filter","act",$LNG{USR_BROWSER_ACTIVE});
	$page->add_element("filter","dis",$LNG{USR_BROWSER_INACTIVE});	
	$page->add_element("filter","pend",$LNG{USR_BROWSER_PENDING});
	$page->add_element("filter","ec",$LNG{USR_BROWSER_FINISHED});		
	#END DATE
	#SET DEF
	$page->SplitData("#begin#users","#end#users");
	$page->deleteBEFORE_AFTER();
	unless($alluserscount){
		$page->SplitData('<!--start_browser-->','<!--end_browser-->');
		$page->deleteINSIDE;
	}
	$page->ParseData;
	return $page->as_string;

}
#################
#FIELDS
#################
sub sort_fields{
	my $account=shift;
	$sql="SELECT * from ${PREF}fields WHERE fk_account=? ORDER by rang ASC";
	my $out=$db->prepare($sql);
	&Error;
	$out->execute($PAR{account});
	&Error;
	my $i;
	while (my %output=%{$out->fetchrow_hashref}){
		$i++;
		update_db("${PREF}fields",{rang=>$i},{pk_fields=>$output{pk_fields}});
		&Error;
	}
}
################
sub delete_field{
	$db->do("DELETE FROM ${PREF}fields WHERE fk_account=? AND pk_fields=?",undef,$PAR{account},$PAR{reckey});
	$db->do("DELETE FROM  ${PREF}doppar WHERE fk_fields=",undef,$PAR{reckey});
	sort_fields($PAR{account});
	print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}");
	exit(1);
}
####################
sub print_field_form{
	my $ischecked_isreq;
	my %error;
	my %INPUT;	
	my $page = new hfparser(
		DATA=>$main_shabl,
		ERROR_AFTER_INPUT=>1
		
	);
	
	if ($PAR{issubmit}){
		$page->set_error("fieldname",$LNG{ERROR_FIELD_NAME_INCORRECT}) if $PAR{fieldname}=~/[^a-zA-Z 0-9_\-.:]/;
		$page->set_error("fieldname","$LNG{HTML_FORM_FIELD_NAME} $PAR{fieldname} $LNG{HTML_FORM_ERR_USED}")
		  if GetSQLCount("SELECT * from ${PREF}fields where fk_account=? AND fieldname=? AND pk_fields<>?",$PAR{account},$PAR{fieldname},$PAR{reckey});
		$page->set_error("fieldname","$LNG{HTML_FORM_FIELD_NAME} $PAR{fieldname} $LNG{HTML_FORM_ERR_RESERVED}") 
		     if ($PAR{fieldname}=~/^name *$/i) or ($PAR{fieldname}=~/^email *$/i);
		$page->set_error("fieldname","$LNG{HTML_FORM_FIELD_NAME} $LNG{HTML_FORM_ERR_EMPTY}") unless $PAR{fieldname};
	}
	if ($PAR{issubmit} && !$page->is_error){
		unless($PAR{reckey}){
			##Add new
			my $isreq;
			$rang1=GetSQLCount("SELECT * from ${PREF}fields where fk_account=?",$PAR{account});
			sort_fields($PAR{account});
			insert_db("${PREF}fields",{type=>$PAR{type},fieldname=>$PAR{fieldname},fk_account=>$PAR{account},is_req=>$PAR{isreq}, rang=>$rang1+1});	
			print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}");
			
			exit(1);
		}else{	
			sort_fields($PAR{account});
			update_db("${PREF}fields",{fieldname=>$PAR{fieldname},fk_account=>$PAR{account},is_req=>$PAR{isreq},type=>$PAR{type}},{pk_fields=>$PAR{reckey}});	
			print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}");
			exit(1);
		}
	}
	####
	#set defaults
	####
	if ($PAR{reckey}){
		$val=select_one_db("SELECT * from ${PREF}fields WHERE pk_fields=?",$PAR{reckey}) || die "Atantion: bed request field  $PAR{reckey} not found";
		$page->set_def('fieldname',$val->{fieldname});
		$page->set_def('type',$val->{type});
		$page->set_def('isreq',$val->{is_req});		
	}
	$page->add_element("type","text","TEXT");
	$page->add_element("type","textarea","TEXTAREA");	
	$page->set_input('isreq',{-value=>'1' -checked=>$ischecked_isreq});
	$page->SplitData("#begin#column_form","#end#column_form");
	$page->deleteBEFORE_AFTER();	
	$page->add_regesp('{body}',&print_columns_browser);
	$page->ParseData;
	return $page->as_string;
}
###################
sub print_add_accounts{
my $OUT, $OUT_UNSUBSCRIBE;
my %account=%ACCOUNT;
my %ADD_ACCOUNTS;
my %ADD_ACCOUNTS_UNSUBSCRIBE;
map{
	$ADD_ACCOUNTS{$_}="checked"
}split(/\|/,$CONF{ADD_ACCOUNTS}) if $CONF{ADD_ACCOUNTS};

map{
	$ADD_ACCOUNTS_UNSUBSCRIBE{$_}="checked"
}split(/\|/,$CONF{ADD_ACCOUNTS_UNSUBSCRIBE}) if $CONF{ADD_ACCOUNTS_UNSUBSCRIBE};
my $d;
map {$d.="($_) = $ADD_ACCOUNTS_UNSUBSCRIBE{$_}\n"}keys %ADD_ACCOUNTS_UNSUBSCRIBE;
#die($d."\n\naccounts: $CONF{ADD_ACCOUNTS}\n unsubscribe:$CONF{ADD_ACCOUNTS_UNSUBSCRIBE}\n\n\n".split("|",$CONF{ADD_ACCOUNTS_UNSUBSCRIBE})."\n\n");
delete $account{$PAR{account}};
return unless %account;
my @add;
foreach (keys %account){
#$OUT.="<LI>".sequre("<input type=\"hidden\" name=\"addaccount\" value=\"$_\">")." - for account <B>$account{$_}</B>";
	$OUT.="<LI><input type=\"checkbox\" name=\"addaccount\" value=\"$_\" $ADD_ACCOUNTS{$_}> $account{$_}\n";
	if($CONF{unsub_account_all}){
		$OUT_UNSUBSCRIBE.="<LI><input type=\"checkbox\" name=\"unsub_account\" value=\"$_\" checked> $account{$_}\n";
	}else{
		$OUT_UNSUBSCRIBE.="<LI><input type=\"checkbox\" name=\"unsub_account\" value=\"$_\" $ADD_ACCOUNTS_UNSUBSCRIBE{$_}> $account{$_}\n";
	}
	
}
#die($OUT_UNSUBSCRIBE."\n\n$d");
if ($OUT){
	$OUT=<<ALL__;
<HR noshade size="4">
<H2>$LNG{HTML_FORM_SUBSCRIBE_ACCOUNTS}</H2>
<DIV align="left"><UL>
$OUT
</UL>
</DIV>
<DIV align="center">
<INPUT TYPE="submit" class="BUTTONmy" name="save" value="$LNG{HTML_FORM_SAVE_ACCOUNTS}">
</DIV>
ALL__
}
if($OUT_UNSUBSCRIBE){
	my $is_checked_all;
	if($CONF{unsub_account_all}){
		$is_checked_all="checked";	
	}
	$OUT.=<<ALL__;
<HR noshade size="4">
<H2>$LNG{HTML_FORM_UNSUBSCRIBE_ACCOUNTS}</H2>
<DIV align="left"><UL>
<LI><input type="checkbox" name="unsub_account_all" value="on" $is_checked_all><B>$LNG{HTML_FORM_UNSUBSCRIBE_ALL}</b></LI>
$OUT_UNSUBSCRIBE
</UL>
</DIV>
<DIV align="center">
<INPUT TYPE="submit" class="BUTTONmy" name="save" value="$LNG{HTML_FORM_SAVE_ACCOUNTS}">
</DIV>
ALL__
}
return "$OUT";
}
####################
sub print_columns_browser{
my $ret;
my $defsize=25;
my $rowssize=5;
my $max=80;
my $def_class="INPUTmy";
my $def_over_class="INPUTmyACT";
my @deftextfield=(-size=>$defsize,-maxlength=>$max,-class=>$def_class,
			-onFocus=>"this.className ='$def_over_class' ; return true;",
 			-onBlur=>" this.className ='$def_class'");			    
my @deftextarea=(-rows=>$rowssize,-columns=>$defsize,-class=>$def_class,
			-onFocus=>"this.className ='$def_over_class' ; return true;",
 			-onBlur=>" this.className ='$def_class'");			    
my $add_new_link=$q->a({-href=>get_full_url({act2=>fieldform,reckey=>""})},$LNG{HTML_FORM_ADD_NEW});
	my $sql="select * from ${PREF}fields where fk_account=? order by rang";
	my $out=$db->prepare($sql);
	$out->execute($PAR{account});
	&Error;
	my $namefield=$q->textfield(
			-name=>'name',
                        -default=>'Jon Doe',@deftextfield
   		    );
	my $emailfield=$q->textfield(
			-name=>'email',
                        -default=>'email@host.com', @deftextfield
		    );		    
	$ret.=<<ALL__;
	<TABLE width="100%" border="0" cellspacing="3" cellpadding="3" align="center"> 
<TR class="data">
	<TD align="right"><B>$LNG{HTML_FORM_NAME}:</B></TD>
	<TD>$namefield <FONT color="red">*</FONT></TD>
	<TD colspan="3" align="center">$LNG{HTML_FORM_RESERVED}</TD>
</TR>
<TR class="data">
	<TD align="right"><B>$LNG{HTML_FORM_EMAIL}:</B></TD>
	<TD>$emailfield <FONT color="red">*</FONT></TD>
	<TD colspan="3" align="center">$LNG{HTML_FORM_RESERVED}</TD>
</TR>
ALL__
	unless ($out->rows){
		$ret.="</TABLE>$add_new_link";
		return $ret;
	}
	my $rows=$out->rows;
	$ret.=<<ALL__;
<TR class="data">
	<TD colspan="5" align="center">$LNG{HTML_FORM_YOU_HAVE} <B>$rows</B> $LNG{HTML_FORM_COSTUM_FIELDS}</TD>
</TR>
ALL__
	while (my %output=%{$out->fetchrow_hashref}){
		my $field;
		$field=$q->textfield(-name=>"df$output{pk_fields}", @deftextfield) if ($output{type} eq 'text');
		$field=$q->textarea(-name=>"df$output{pk_fields}", @deftextarea) if ($output{type} eq 'textarea');		
		my $editlink=$q->a({-href=>get_full_url({act2=>'fieldform',reckey=>$output{pk_fields}})},'Edit');
		my $onCL=<<ALL__;
return confirm('$LNG{HTML_FORM_CONFIRM}');		
ALL__
		my $droplink=$q->a({-onClick=>$onCL,
				-href=>get_full_url({act2=>'delfield',reckey=>$output{pk_fields}})},$LNG{HTML_FORM_DROP});
		my $uplink=  $q->a({-href=>get_full_url({act2=>'up',reckey=>$output{pk_fields}})},$LNG{HTML_FORM_UP}) if $output{rang}>1;
		$uplink=$LNG{HTML_FORM_UP} unless $output{rang}>1;		
		my $downlink=$q->a({-href=>get_full_url({act2=>'down',reckey=>$output{pk_fields}})},$LNG{HTML_FORM_DOWN}) if $output{rang} < $out->rows;
		$downlink=$LNG{HTML_FORM_DOWN} unless $output{rang} < $out->rows;
		my $isreq="<FONT color=\"red\">*</FONT>" if $output{is_req};
		$ret.=<<ALL__;
<TR class="data">
	<TD align="right"><B>$output{fieldname}:<B></TD>
	<TD>$field $isreq</TD>
	<TD>$editlink</TD>
	<TD>$droplink</TD>
	<TD>$LNG{HTML_FORM_MOVE} $uplink | $downlink</TD>	
</TR>
ALL__
	}
	$ret.=<<ALL__;
	</TR></TABLE>
$add_new_link
ALL__
return $ret;
}
###################
sub get_html_code{
	my $account=shift;
	my $html;
	$account=$PAR{account} unless $account;
	my $address=$ENV{HTTP_HOST};
	my $scriptdir=$ENV{SCRIPT_NAME};
	(my $src=$scriptdir)=~s#[^/]*$##;
	$html=<<ALL__;
<!-- Start form -->
<form name="mailform" method="post" action="http://$address${src}register.cgi">
  <table width="80%" border="0" cellspacing="0" cellpadding="4">
   <tr>
    <td align="right" width="50%"><b>$LNG{HTML_FORM_NAME}:</b></td>
    <td width="50%">
     <input type="text" name="name" size="25" maxlength="40">
     <font color="red">*</font> 
     <input type="hidden" name="account" value="$account">
    </td>
   </tr>
   <tr> 
    <td align="right" width="50%"><b>$LNG{HTML_FORM_EMAIL}:</b></td>
    <td width="50%">
     <input type="text" name="email" size="25" maxlength="40">
     <font color="red">*</font> 
    </td>
   </tr>
ALL__
	
	$sql="SELECT * from ${PREF}fields WHERE fk_account=? ORDER by rang";
	my $out=$db->prepare($sql);
	
	&Error;
	$out->execute($account);
	&Error;
	while (my %output=%{$out->fetchrow_hashref}){
		my $isrec;
		my $innput;
		if ($output{type} eq 'text'){
			$innput=<<ALL__;
 <input type="text" name="dp$output{pk_fields}" size="25" maxlength="40">
ALL__
		}else{
	$innput=<<ALL__;
 <TEXTAREA name="dp$output{pk_fields}" rows="4" columns="25">
 </TEXTAREA>
ALL__

		}
		$isrec="<font color=\"red\">*</font>" if ($output{is_req} ==1);
		$html.=<<ALL__;
 <tr> 
  <td align="right" width="50%"><b>$output{fieldname}:</b></td>
   <td width="50%">
     $innput $isrec 
  </td>
 </tr>
ALL__
	}

$html.=<<ALL__;	
 <tr> 
   <td align="center" colspan="2"> <input type="submit" value="$LNG{HTML_FORM_SUBSCRIBE}"></td>
 </tr>
 </table>
              </form>
<!-- End form -->
ALL__
	
	return $html;
}
###################
sub print_columns{
	my $page = new hfparser(
		DATA=>$main_shabl		
	);
	if($PAR{save}){
		my @act=$q->param('addaccount');
		
		save_config($PAR{account},"ADD_ACCOUNTS",join("|",@act));
		save_config($PAR{account},"unsub_account_all",$PAR{unsub_account_all});
		my @act_unsubscribe=$q->param('unsub_account');
		#die (join("|",@act_unsubscribe));
		save_config($PAR{account},"ADD_ACCOUNTS_UNSUBSCRIBE",join("|",@act_unsubscribe));
		
	}
	sort_fields($PAR{account});
	$page->SplitData("#begin#column_browser","#end#column_browser");
	$page->set_input('htmlcode',{columns=>80,default=>get_html_code($PAR{account})});
	$page->add_regesp('{formPrewiew}',get_html_code($PAR{account}));
	$page->deleteBEFORE_AFTER();	
	$page->add_regesp('{body}',&print_columns_browser);
	$page->add_regesp('{ADDACCOUNTS}',&print_add_accounts);
	$page->ParseData;
	return $page->as_string;
}
#############
sub get_user_parametr{	
my $field=shift;
my $user=shift;
my $out;
my $out=select_one_db("SELECT * from ${PREF}doppar WHERE fk_fields=? AND fk_user=?",$field,$user);
return $out->{value};
}

#####################
#sub print_undeliv{
#	my @params=(qw(isbounce bnaccount replyto bnpop3server bnpop3user bnpop3pass bnpop3port bncount bnaction));
#	my @req=();
#	my $page = new hfparser(
#		DATA=>$main_shabl		
#	);
#	if ($PAR{issubmit}){
#		if($PAR{isbounce}){
#			push(@req,qw(replyto bnpop3server bnpop3user bnpop3pass bnpop3port bncount bnaction))
#		}
#		foreach (@req){
#			$page->set_error($_,$LNG{ERROR_REQUIRED}) if ($PAR{$_} eq '');
#		}
#		if (length($PAR{bnpop3port})>0){
#			if ($PAR{bnpop3port}=~/[^0-9]/){
#				$page->set_error('bnpop3port',"Must be the number");
#			}
#		}
#		if (length($PAR{bncount})>0){
#			if ($PAR{bncount}=~/[^0-9]/){
#				$page->set_error('bncount',"Must be the number");
#			}
#			if ($PAR{bncount}<1){
#				$page->set_error('bncount',"Must be more then 0");
#			}
#		}
#		unless ($page->is_error){
#			foreach(@params){
#				save_config($PAR{account},$_,$PAR{$_});
#			}
#			$page->add_regesp('{error}', qq|<h1 class="mess">$LNG{MESS_SETTINGS_UPDATED}</h1>|);
#		}
#	}
#	####
#	foreach(@params){
#		$page->set_def($_,$CONF{$_});
#	}
#	$page->set_def('bnpop3port',110) unless $CONF{bnpop3port};
#	$page->set_def('bncount',5) unless $CONF{bncount};	
#	$page->set_default_input("text","size",35);
#	#$page->set_default_input("textarea","rows",4);
#	$page->add_element('bnaction','remove','Remove from database');
#	$page->add_element('bnaction','inact',"Set $LNG{USR_BROWSER_INACTIVE}");
#	$page->add_element('bnaccount','this','in current account');
#	$page->add_element('bnaccount','all','in all accounts');	
#	$page->set_input("bnpop3port",{size=>4, MAXLENGTH=>5});
#	$page->set_input("bncount",{size=>4, MAXLENGTH=>5});
#	$page->SplitData("#begin#undeliv","#end#undeliv");
#	$page->deleteBEFORE_AFTER();	
#	$page->ParseData;
#	return $page->as_string;
#}
#####################
sub print_config{
	my %httppars=(redirsub=>1, redirrem=>0,doiconfurl=>0);
	my @params=(qw(adminname adminemail replyto messlogging defname subscribeemail pop3server pop3user pop3pass pop3port fromname fromemail  ispurge isnotifsubscr isnotifunsubscr isdoi doiconfurl ispop3 banmails banmailserror defcharset no_uppercase),keys %httppars);
	my @req=(qw(defname fromemail fromname redirsub redirrem));
	my $page = new hfparser(
		DATA=>$main_shabl		
	);
	if ($PAR{issubmit}){
		if($PAR{ispop3}){
			push(@req,qw(pop3server pop3user pop3pass pop3port subscribeemail))
		}
		if($PAR{banmails}){
			push(@req,'banmailserror')
		}
		if($PAR{isnotifsubscr} or $PAR{isnotifunsubscr}){ 
			push(@req,qw(adminname adminemail));
			$page->set_error("adminemail",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{adminemail},0));
		}
#		if($PAR{returnpath}){ 
#			$page->set_error("returnpath",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{returnpath},0));
#		}
#		if($PAR{errorsto}){ 
#			$page->set_error("errorsto",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{errorsto},0));
#		}		
		$httppars{doiconfurl}=1 if $PAR{isdoi};
		$httppars{redirrem}=1; #if $PAR{isaddunsubscrlink};
		foreach (keys %httppars){
			$page->set_error($_,$LNG{ERROR_URL_INCORRECT}) unless check_url($PAR{$_},$httppars{$_});
		}
		foreach (@req){
			$page->set_error($_,$LNG{ERROR_REQUIRED}) if ($PAR{$_} eq '');
		}
		$page->set_error("fromemail",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{fromemail},0));
		if ($PAR{pop3port}){
			if ($PAR{pop3port}=~/[^0-9]/){
				$page->set_error('pop3port',$LNG{ERROR_NUMBER_REQUIRED});
			}
		}
		unless ($page->is_error){
			foreach(@params){
				#$PAR{$_}=~s/^(http:\/\/+)+// if exists($httppars{$_});
				save_config($PAR{account},$_,$PAR{$_});
			}
			$page->add_regesp('{error}', qq|<h1 class="mess">$LNG{MESS_SETTINGS_UPDATED}</h1>|);
		}
	}
	foreach (@params){
		if (exists($httppars{$_})){
			$CONF{$_}="http://" unless $CONF{$_};
		}
		$page->set_def($_,$CONF{$_});
	}
	####
	$page->add_element('defcharset','',$LNG{TXT_DEFAULT});
	map{$page->add_element('defcharset',$_,$ENCODINGS{$_});}sort {$ENCODINGS{$a} cmp $ENCODINGS{$b}} keys %ENCODINGS;
	$page->set_default_input("text","size",35);
	$page->set_default_input("textarea","rows",4);
	$page->set_default_input("textarea","columns",35);
	$page->set_input("pop3port",{size=>4, MAXLENGTH=>5});
	$page->SplitData("#begin#config","#end#config");
	$page->deleteBEFORE_AFTER();	
	$page->ParseData;
	return $page->as_string;
}
####################
sub print_main_account_data{

	my $page = new hfparser(
		DATA=>$main_shabl		
	);
	$page->SplitData("#begin#main","#end#main");
	$page->deleteBEFORE_AFTER();
	$page->add_regesp('{main_menu_body}',get_full_menu(\@ACCOUNTMENU));
	$page->add_regesp('{account}',$PAR{account});
	$page->add_regesp('{total_prospects}',GetSQLCount("Select * from ${PREF}user WHERE fk_account=?",$PAR{account}));
	$page->add_regesp('{total_active}',GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND  isact=1",$PAR{account}));
	$page->add_regesp('{total_inactive}',GetSQLCount("Select * from ${PREF}user WHERE fk_account=? AND  isact<>1",$PAR{account}));
	$page->ParseData;
	return $page->as_string;
}
#first for account
##########################
sub move_down_field{
sort_fields($PAR{account});
my $el=select_one_db("SELECT * from ${PREF}fields WHERE pk_fields=?",$PAR{reckey});
my $rang=$el->{rang};
my $count= GetSQLCount("SELECT * from ${PREF}fields WHERE fk_account=?",$PAR{account});
if ($rang<$count){
 	$db->do("UPDATE ${PREF}fields Set rang=$rang WHERE fk_account=? and rang=$rang+1",undef, $PAR{account});
	&Error;
	$db->do("UPDATE ${PREF}fields Set rang=rang+1 WHERE pk_fields=?",undef, $PAR{reckey});
	&Error; 
}
sort_fields($PAR{account});
print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}");
exit();
}
#######################
sub move_up_field{
sort_fields($PAR{account});
my $el=select_one_db("SELECT * from ${PREF}fields WHERE pk_fields=?",$PAR{reckey});
my $rang=$el->{rang};
my $count= GetSQLCount("SELECT * from ${PREF}fields WHERE fk_account=?",$PAR{account});
if ($rang>1){
 	$db->do("UPDATE ${PREF}fields Set rang=$rang WHERE fk_account=? and rang=$rang-1",undef, $PAR{account});
	&Error;
	$db->do("UPDATE ${PREF}fields Set rang=rang-1 WHERE pk_fields=?",undef, $PAR{reckey});
	&Error; 
}
sort_fields($PAR{account});
print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=columns&account=$PAR{account}");
exit();
}
######################
sub print_users_loadfrom{
	my $page = new hfparser(
		DATA=>$main_shabl		
	);
	$page->SplitData("#start#user_loadfrom","#end#user_loadfrom");
	add_menu_prospects($page);
	$page->deleteBEFORE_AFTER;
	if($PAR{issubmit}){
		my $add;
		$add="AND isact='1'" if ($PAR{activ} eq 'act');
		$add="AND isact='0'" if ($PAR{activ} eq 'dis');
		my $sql="SELECT * FROM ${PREF}user WHERE fk_account=?  $add";
		my $out=$db->prepare($sql);
		$out->execute($PAR{'import'});
		my @OUT=();
		while (my %output=%{$out->fetchrow_hashref}){
			delete($output{pk_user});
			$output{fk_account}=$PAR{account};
			insert_db("${PREF}user",\%output) unless GetSQLCount("SELECT * FROM ${PREF}user WHERE fk_account=? AND email=?",$PAR{account},$output{email});
		}
		print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=users&account=$PAR{account}");
		exit;
	}
	$page->add_element("activ","",$LNG{USR_BROWSER_ALL});
	$page->add_element("activ", "act", $LNG{USR_BROWSER_ACTIVE});
	$page->add_element("activ", "dis", $LNG{USR_BROWSER_INACTIVE});
	my $sql="SELECT ${PREF}account.name as name,${PREF}account.pk_account as reckey, count(pk_user) as mycount  FROM  ${PREF}account LEFT JOIN  ${PREF}user ON fk_account=pk_account  WHERE pk_account <> ? GROUP BY fk_account HAVING mycount>0";
	my $out=$db->prepare($sql);
	$out->execute($PAR{account});
	&Error($sql);
	unless($out->rows){
		$page->SplitData("<!--START_RESULT-->","<!--END_RESULT-->");
		$page->replaceINSIDE("<h1 class=\"mess\">$LNG{USR_BROWSER_CANT_IMPORT}</H1>");
		
	}
	while (my %output=%{$out->fetchrow_hashref}){
		$page->add_element("import",$output{reckey},"$output{name} [$output{mycount}]");
	}
		
	
	$page->ParseData;
	return $page->as_string;	
}
######################
sub print_users_export{
	my $allcount=GetSQLCount("SELECT * FROM ${PREF}user WHERE fk_account=? AND isact=1",$PAR{account});
	my $page = new hfparser(
		DATA=>$main_shabl		
	);
	$page->SplitData("#start#user_export","#end#user_export");
	add_menu_prospects($page);	
	$page->deleteBEFORE_AFTER;
	if($PAR{issubmit}){
		my $add;
		$add="AND isact='1'" if ($PAR{activ} eq 'act');
		$add="AND isact='0'" if ($PAR{activ} eq 'dis');
		my $sql="SELECT * FROM ${PREF}user WHERE fk_account=?  $add";
		my $out=$db->prepare($sql);
		&Error;
		$out->execute($PAR{account});
		&Error;
		my @OUT=();
		while (my %output=%{$out->fetchrow_hashref}){
			my $shabl=$PAR{format};
			$shabl=~s/TAB/\t/;
			$shabl=~s/--email--/$output{email}/;
			$shabl=~s/--name--/$output{name}/;
			push(@OUT,$shabl);
		}
		if ($PAR{to} eq 'file'){
			print "Content-type: application/octet-stream\nContent-Disposition: attachment; filename=prospects.txt\n\n";
			print join("\n",@OUT);
			exit;
		}else{
			@OUT=map{sequre($_)}@OUT;
			$page->SplitData("<!--START_RESULT-->","<!--END_RESULT-->");
			$page->replaceINSIDE($q->h1("$LNG{USR_BROWSER_EXPORTED} ".$out->rows." $LNG{USR_BROWSER_PROSPECTS}").join("<BR>\n",@OUT));
		}
	}
	unless($allcount){
		$page->SplitData("<!--START_RESULT-->","<!--END_RESULT-->");
		$page->replaceINSIDE($q->h1($LNG{USR_BROWSER_CANT_EXPORT}));
	}	
	$page->add_regesp('{all_count}',$allcount);
	$page->add_regesp('{account}',$PAR{account});
	$page->add_element("activ","",$LNG{USR_BROWSER_ALL});
	$page->add_element('activ', 'act', $LNG{USR_BROWSER_ACTIVE});
	$page->add_element('activ', 'dis', $LNG{USR_BROWSER_INACTIVE});

	$page->add_element("format","--email--",$LNG{USR_BROWSER_EXPORT_EMAIL_ONLY});
	$page->add_element("format","--name-- --email--","$LNG{USR_BROWSER_EXPORT_NAME} $LNG{USR_BROWSER_EXPORT_EMAIL}");	
	$page->add_element("format","<--name--> --email--","<$LNG{USR_BROWSER_EXPORT_NAME}> $LNG{USR_BROWSER_EXPORT_EMAIL}");		
	$page->add_element("format","\"--name--\" --email--","\"$LNG{USR_BROWSER_EXPORT_NAME}\" $LNG{USR_BROWSER_EXPORT_EMAIL}");	
	$page->add_element("format","--name--|--email--","$LNG{USR_BROWSER_EXPORT_NAME}|$LNG{USR_BROWSER_EXPORT_EMAIL}");		
	$page->add_element("format","--name--:--email--","$LNG{USR_BROWSER_EXPORT_NAME}:$LNG{USR_BROWSER_EXPORT_EMAIL}");		
	$page->add_element("format","--name--,--email--","$LNG{USR_BROWSER_EXPORT_NAME},$LNG{USR_BROWSER_EXPORT_EMAIL}");			
	$page->add_element("format","--name--TAB--email--","$LNG{USR_BROWSER_EXPORT_NAME}<TAB>$LNG{USR_BROWSER_EXPORT_EMAIL}");
	$page->add_element("to","file",$LNG{USR_BROWSER_EXPORT_FILE});
	$page->add_element("to","here",$LNG{USR_BROWSER_EXPORT_PAGE}); 
	$page->set_def("to","here");
	$page->ParseData;
	return $page->as_string;
}


#######################
sub print_users_bulk{
my $page = new hfparser(
		DATA=>$main_shabl		
	);
	add_menu_prospects($page);	
my @quer;	
if ($PAR{issubmit}){
	@quer=split(/\n/,$PAR{bulk});
	map{s/\s+//g}@quer;
	map{s/\*/%/g}@quer;
	my @QUER;
	foreach(@quer){
		push @QUER, $_ if /[a-zA-Z0-9%.\-_@]/
	}
	unless (@QUER){
		$page->set_error("bulk",$LNG{USR_BROWSER_BULK_QUERY_INCORRECT});
	}
	@quer=map{"(${PREF}user.email LIKE '\%$_\%')"}@QUER;
	my $WHERE;
	if ($PAR{accounts} eq 'all'){
		$WHERE=join(" OR ",@quer);
	}else{
		$WHERE="(".join(" OR ",@quer).") AND fk_account='$PAR{account}'";
	}
	unless ($page->is_error){
		$page->SplitData("#start#user_confirmbulk","#end#user_confirmbulk");
		$page->deleteBEFORE_AFTER;
		$page->add_regesp('{account}',$PAR{account});
		my $sql="SELECT * FROM ${PREF}user WHERE $WHERE";
		my $count=GetSQLCount($sql);
		$page->add_regesp('{countusers}',$count);
		unless($PAR{issubmit2}){
			$page->add_regesp('{status}','will be');
			unless($count){
				$page->SplitData("<!--startdel-->","<!--enddel-->");
				$page->deleteINSIDE;
			}
		}else{	
			$page->add_regesp('{status}','');
			my @users = @{$db->selectcol_arrayref("select pk_user from ${PREF}user WHERE $WHERE")};
			if (@users){
				my $in=join ",",@users;
				$db->do("DELETE FROM ${PREF}user WHERE pk_user IN ($in)");
				&Error;
				$db->do("DELETE FROM ${PREF}doppar WHERE fk_user IN ($in)");
				&Error;
				$db->do("DELETE FROM ${PREF}tosend WHERE fk_user IN ($in)");			
				&Error;
				$db->do("DELETE FROM ${PREF}doiaccounts WHERE fk_user IN ($in)");
				&Error;
				$db->do("DELETE FROM ${PREF}sentlog  WHERE fk_user IN ($in)");
				&Error;
				$db->do("DELETE FROM ${PREF}link_clicks  WHERE fk_user IN ($in)");
				&Error;
			}
			OPTIMIZEtables();
			$page->SplitData("<!--startdel-->","<!--enddel-->");
			$page->deleteINSIDE;
			
		}
		$page->ParseData;
		return $page->as_string;
	}
}
	$page->SplitData("#start#user_bulk","#end#user_bulk");
	$page->set_default_input("textarea","rows",12);	
	$page->set_default_input("text","size",3);		
	$page->set_default_input("textarea","columns",55);
	unless($PAR{issubmit2}){
		$page->add_element("accounts","this",$LNG{USR_BROWSER_BULK_CURRENT_ACCOUNT});
		$page->add_element("accounts","all",$LNG{USR_BROWSER_BULK_ALL_ACCOUNTS});
	}
	$page->add_regesp('{account}',$PAR{account});
	$page->deleteBEFORE_AFTER;
	$page->ParseData;
	return $page->as_string;
}
#######################
sub print_users_import{
my $page = new hfparser(
		DATA=>$main_shabl		
	);
if ($PAR{issubmit}){
	if($PAR{add_to} eq "prospects_active"){
		$page->set_error("interval",$LNG{ERROR_NUMBER_REQUIRED}) if ($PAR{interval}=~/[^0-9]/);
		$page->set_error("interval",$LNG{ERROR_REQUIRED}) if ($PAR{interval} eq "");
	}
	my $days;
	if($PAR{add_to} eq "prospects_active"){
		$days=$PAR{interval};
	}else{
		$days=-1;
	}
	unless ($page->is_error){
		my @str;
		if ($q->param("uploaded_file")){
			$fh=$q->upload("uploaded_file") || die "$LNG{ERROR_CANT_UPLOAD_FILE} $!";
			@str=<$fh>;	
			chomp(@str);
		}else{
			@str=split(/\n/,$PAR{import});
			chomp(@str);
		}
		my $i=0;
		my @errors;
		my $count=0;
		my $SubscrMess;
		if ($CONF{sendsubscr}){
			my $messages=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend=?",$PAR{account},'subscribe');
			$SubscrMess=$messages->{pk_mess};
		}
		foreach (@str){
			$i++;
			s/([a-zA-Z0-9_.\-]+@[a-zA-Z0-9_.\-]+)//;
			my $mail = lc($1);
			unless ($mail){
				push (@errors, "$LNG{TXT_LINE} $i: $LNG{ERROR_CANT_FIND_EMAIL}");
				next;
			}
			unless (checkemail($mail)){
				push (@errors, "$LNG{TXT_LINE} $i: $LNG{TXT_EMAIL} $mail $LNG{TXT_ISINCORRECT}");
				next;
			}
			if($CONF{useblacklist}){
				if(GetSQLCount("SELECT * FROM ${PREF}bounce_banemails WHERE email=?",$mail)){
					push (@errors, "$LNG{TXT_LINE} $i: $LNG{TXT_EMAIL} $mail $LNG{TXT_IS_BOUNSED}") ;
					next;
				}
			}
			if (GetSQLCount("SELECT * FROM ${PREF}user WHERE email=? AND fk_account=?",$mail,$PAR{account})){
				push (@errors, "$LNG{TXT_LINE} $i: $LNG{TXT_EMAIL} $mail $LNG{TXT_IS_EXISTS}");
				next;
			}
			s/[^A-Za-z.]/ /g;
			s/^ +//;s/ +$//;
			while (s/  / /g){}
			my @words=split(/ /);
			unless($CONF{no_uppercase}){
				@words=map{ucfirst(lc($_))}@words;
			}
			$name=join(' ',@words);
			$count++;
			$db->do("INSERT INTO ${PREF}user (fk_account,name,email,days,datereg) VALUES (?,?,?,?,$NOW)",undef,$PAR{account},preparename($name,$CONF{no_uppercase}),prepareemail($mail),$days);	
			if ($PAR{sendsubscribe}){
				if ($SubscrMess){
					my @users = @{$db->selectcol_arrayref("select MAX(pk_user) as max from ${PREF}user WHERE fk_account=$PAR{account}")};
					my $maxuser=$users[0];
					if ($maxuser){
						AddToSend($maxuser,$SubscrMess);
					}
				}
			}
			&Error;
		}
		my $out.=$q->h1("$count $LNG{USR_BROWSER_IMPORT_PROSPADD}.");
		if (@errors){
			$out.=$q->h2(scalar(@errors)." $LNG{USR_BROWSER_IMPORT_ERRORS_DETECTED}");
			$out.=join "<BR>",@errors;
		}
		return $out;
	}
}
	$page->SplitData("#start#user_import","#end#user_import");
	add_menu_prospects($page);
	$page->set_default_input("textarea","rows",12);	
	$page->set_default_input("text","size",3);		
	$page->set_default_input("textarea","columns",55);
	$page->set_def("interval",0);
	$page->add_regesp('{account}',$PAR{account});
	$page->deleteBEFORE_AFTER;
	$page->ParseData;
	return $page->as_string;
	next
}
######################
sub print_personalize{
	my @FIELDS=map{"<LI><B>[ADD$_->{key}]</B> - $_->{name}"}load_account_fields($PAR{account});
	my $page = new hfparser(
		DATA=>$main_shabl,
		FROM=>'#start#personalize',TO=>'#end#personalize'
	);
	my $additional="";
	$additional.="<LI><B>$LNG{MESS_PERS_EXTRA}</b><UL>".join("\n",@FIELDS)."</UL>" if @FIELDS;
	opendir(DIR,'templates');
	my @templates=grep{ /\.txt$/ } readdir(DIR);
	my @files=();
	map{my $f_name=$_; s/\.txt$//;push(@files,"<LI>[LOAD_FROM_FILE_$_] -  $LNG{MESS_PERS_LOAD_FROM_FILE} <b>$f_name</b></LI>")}@templates;
	$additional.="<LI><B><font color=\"red\">$LNG{MESS_PERS_NEW}!</font>$LNG{MESS_PERS_LOAD_FROM_TEMPL}</b>\n<UL>\n\t".join("\n\t",@files)."\n</UL>" if @templates ;
	my $sql="SELECT ${PREF}links.pk_link,${PREF}links.name,${PREF}links.redirect_link FROM ${PREF}links LEFT JOIN ${PREF}account ON pk_account=fk_account WHERE pk_account=?";
	my $out=$db->prepare($sql);
	$out->execute($PAR{account});
	my @LINKS;
	while (my $output=$out->fetchrow_hashref){
		push(@LINKS,"<LI><B>[LINK$output->{pk_link}] - $LNG{MESS_PERS_REDIR_LINK} <u><b>$output->{name}</b></u> $LNG{MESS_PERS_REDIR_LINK_TO}  <a href=\"$output->{redirect_link}\" target=\"_blank\">$output->{redirect_link}</a></LI>");
	}
	$additional.="<LI><B>$LNG{MESS_PERS_TRACK}</b>\n<UL>\n\t".join("\n\t",@LINKS)."\n</UL>" if @LINKS;
	$page->add_regesp('{additional}',$additional);	
	$page->ParseData;
	return $page->as_string;
}
######################
sub print_account_newmess{
	my @req=qw(subject mess);
	my $page = new hfparser(
		DATA             =>$main_shabl,		
		ERROR_AFTER_TEMPL=>"<SPAN class=\"ERROR_ELEMENT\">&nbsp;&nbsp;&nbsp;&nbsp;###ERR###</SPAN>"
	);
	$page->SplitData("#start#user_newmess","#end#user_newmess");
	$page->deleteBEFORE_AFTER();
	$page->add_regesp('{error_date}',"");
	if ($PAR{issubmit}){
		foreach (@req){
			$page->set_error($_,$LNG{ERROR_REQUIRED}) if ($PAR{$_} eq '');
		}
		if ($PAR{typesend} eq 'auto'){
			if ($PAR{days}=~/[^0-9]/){
				$page->set_error("days",$LNG{ERROR_NUMBER_REQUIRED});
			}elsif($PAR{days}>2000){
				$page->set_error("days",$LNG{ERROR_TO_BIG});
			}else{
				$page->set_error("days","<NOBR>$LNG{ERROR_ALREADY_USED}<NOBR>") if GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and typesend='auto' AND days=? AND pk_mess<>'$PAR{reckey}'",$PAR{account},$PAR{days});
			}
		}
		if ($PAR{typesend} eq 'doi'){
			$page->set_error('mess',"$LNG{MESS_ERR_CONFIRM}: [CONFIRM_URL]") unless ($PAR{mess}=~/\[CONFIRM_URL\]/)
		}		
		if ($PAR{typesend} eq 'senddat'){
			my ($y,$m,$d)=($PAR{year}-1900,$PAR{month}-1,$PAR{day});
			my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($MY_TIME+60*60*24);			
			my $timelocalsend=timelocal(0,0,0,$d,$m,$y);
			my $timelocalnow=timelocal(0,0,0,$mday,$mon,$year);
			$dif = $timelocalsend - $timelocalnow;
			if ($dif<0){
				$page->set_error("day"," ");
				$page->set_error("month"," ");
				$page->set_error("year"," ");				
				$page->add_regesp('{error_date}',"<NOBR><SPAN class=\"ERROR_ELEMENT\">$LNG{ERROR_DATE_INCORRECT}</SPAN><NOBR>");				
			}
		}

		unless ($page->is_error){
			my $id;
		
			my $days,$datesend;
			$days=0 unless ($PAR{typesend} eq 'auto');
			$days=$PAR{days} if ($PAR{typesend} eq 'auto');
			$datesend='' unless ($PAR{typesend} eq 'senddat');
			$datesend="$PAR{year}-$PAR{month}-$PAR{day}" if ($PAR{typesend} eq 'senddat');
			unless($PAR{reckey}){
				$id=insert_db("${PREF}mess",{subject =>$PAR{subject},mess=>$PAR{mess},
					type=>$PAR{type},typesend=>$PAR{typesend},
					fk_account=>$PAR{account},days=>$days,
					senddat=>$datesend,
					priority=>$PAR{priority},
					encoding=>$PAR{encoding}
					});
			}else{
				update_db("${PREF}mess",
					{subject =>$PAR{subject},mess=>$PAR{mess},
					type=>$PAR{type},typesend=>$PAR{typesend},
					fk_account=>$PAR{account},days=>$days,
					senddat=>$datesend,
					encoding=>$PAR{encoding},
					priority=>$PAR{priority}},
					{pk_mess=>$PAR{reckey}}
				);
				$id=$PAR{reckey};
				
			}
			
			if ($filename=$q->param('uploaded_file')){
				$file=$filename;
				$file=~s(^.*\\)();$file=~s(^.*/)();
				my $data;
				$fh=$q->upload("uploaded_file");
				die ("Can not upload file ".$q->param('uploaded_file')." - not defined filehandle in CGI.pm upload() function $! $@ \n Temp directory is $TempFile::TMPDIRECTORY\n\n") unless $fh;
				binmode($fh);
				my $tmpdata;
				while(sysread $fh,$tmpdata,1024*10){$data.=$tmpdata};
				insert_db("${PREF}attach",{filename=>$file,data=>$data,fk_mess=>$id,len=>length($data)});
			}
			print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&act2=mess&account=$PAR{account}");
			exit();
		}
	}
	my $REPL;

	$page->set_def("days", 0);
	#DATE
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($MY_TIME);
	$year+=1900;$mon++;
	foreach (1..31){
		my $dd=sprintf("%02d",$_);
		$page->add_element("day",$_,$dd);
	}
	$page->set_def("day",$mday);
	my @month=($LNG{MONTH_1},$LNG{MONTH_2},$LNG{MONTH_3},$LNG{MONTH_4},$LNG{MONTH_5},$LNG{MONTH_6},$LNG{MONTH_7},$LNG{MONTH_8},$LNG{MONTH_9},$LNG{MONTH_10},$LNG{MONTH_11},$LNG{MONTH_12});
	foreach (1..12){
		$page->add_element("month",$_,$month[$_-1]);
	}
	$page->set_def("month",$mon);
	foreach ($year..$year+3){
		$page->add_element("year",$_);
	}
	$page->set_def("year",$year);
	
	$page->add_element("type","text","TEXT");
	$page->add_element("type","html","HTML");	
	map{$page->add_element('priority',$_,$PRIORITY{$_})}sort keys %PRIORITY;
	$page->add_element('encoding','',$LNG{TXT_DEFAULT});
	map{$page->add_element('encoding',$_,$ENCODINGS{$_});} sort {$ENCODINGS{$a} cmp $ENCODINGS{$b}} keys %ENCODINGS;
	unless($PAR{reckey}){
		$page->add_regesp("{header}",$LNG{MESS_CREATE_NEWMESS});
		$page->SplitData("###FORNEW###","###END_FORNEW###");
		$REPL= join "",$page->getINSIDE();
		$page->add_regesp("{attach}","");
		$page->set_def("encoding",$CONF{'defcharset'});
	}else{
		$page->add_regesp("{header}",$LNG{MESS_EDIT_MESS});
		my $mess=load_mess($PAR{reckey});
		$page->set_def("subject",$mess->{subject});
		$page->set_def("mess",$mess->{mess});
		$page->set_def("type",$mess->{type});
		$page->set_def("typesend",$mess->{typesend});
		$page->set_def("encoding",$mess->{encoding});
		$page->set_def("priority",$mess->{priority});
		if ($mess->{typesend} eq 'auto'){
			$page->SplitData("###FORAUTO###","###END_FORAUTO###");
			$REPL= join "",$page->getINSIDE();
			$page->set_def("days",$mess->{days});
		}elsif($mess->{typesend} eq 'manual' or $mess->{typesend} eq 'senddat' or $mess->{typesend} eq 'sent'){
			$PAR{typesend}=$mess->{typesend};
			
			$page->SplitData("###FORDATE###","###END_FORDATE###");
			$REPL= join "",$page->getINSIDE();
		}else{
			$PAR{typesend}=$mess->{typesend};
			$page->SplitData("###FORSUBSCR###","###END_FORSUBSCR###");
			$REPL= join "",$page->getINSIDE();
		}
		if ($mess->{typesend} eq 'senddat'){
			$page->set_def("day",$mess->{n_day});
			$page->set_def("month",$mess->{n_month});			
			$page->set_def("year",$mess->{n_year});						
		}
		if ($mess->{typesend} eq 'sent'){
			$PAR{typesend}="manual";
		}
	
		my @attach=map{
			"<NOBR><a href=\"$SCRIPT_NAME?ses=$PAR{ses}&act=getfile&id=$_\" TITLE=\"$LNG{MESS_DOWNLOAD_ATTACH}\">$mess->{ATTACH}{$_}{filename}</A> (". int($mess->{ATTACH}{$_}{len}/100)/10 ."K)". 
			"&nbsp;&nbsp;&nbsp;<a href=\"$SCRIPT_NAME?ses=$PAR{ses}&act=delfile&id=$_&reckey=$PAR{reckey}&account=$PAR{account}\" >$LNG{DELETE}</a></NOBR>"	
		} keys %{$mess->{ATTACH}};
		my $files=join("<BR>",@attach);
		my $att;
		if ($files){
		$att=<<ALL__;
          <tr> 
            <td align="right" width="11%" valign="top"><b>$LNG{MESS_ATTACHMENTS}:</b></td>
            <td width="89%">$files</td>
          </tr>
ALL__
		}
		$page->add_regesp("{attach}",$att);
#		$page->add_regesp("{attach}",$mess->{ATTACH});

	}
	$page->SplitData("###HIDE_ALL###","###END_HIDE_ALL###");	
	$page->replaceINSIDE($REPL);
	
	$page->add_regesp('{account}',$PAR{account});
	$page->add_regesp('{personalize}',&print_personalize);
	
	$page->set_input("subject", {size=>35});
	$page->set_input("days", {size=>4});
	$page->set_input("mess", {columns=>70,rows=>30});	
	
	$page->add_regesp('{radio_autorespond}',$q->radio_group(-default=>$PAR{typesend},-name=>'typesend',-values=>['auto'],-labels=>{auto=>$LNG{MESS_TYPE_AUTO}}));
	$page->add_regesp('{radio_manual}',$q->radio_group     (-default=>$PAR{typesend},-name=>'typesend',-values=>['manual'],-labels=>{manual=>$LNG{MESS_TYPE_MANUAL}}));
	$page->add_regesp('{radio_sendatdate}',$q->radio_group (-default=>$PAR{typesend},-name=>'typesend',-values=>['senddat'],-labels=>{senddat=>$LNG{MESS_TYPE_SCHEDULED}}));
	$page->ParseData;
	return $page->as_string;
}
sub print_show_mess{
	&printheader;
	my $mess=load_mess($PAR{mess});
	%CONF=loadCONF($PAR{account});
	$messtext=$mess->{mess};
	$messtext=FillTextFromFile($messtext);
	$unslink="$CONF{serverurl}register.cgi?em=$user->{email}&act=un&at=$PAR{account}";
	if($mess->{type}=~/html/i){
		print $messtext;
		return;
	}
	my $page = new hfparser(
		DATA =>"$SHABL_DIR/preview.html",		
	);
	$page->add_regesp('{subject}',sequre($mess->{subject}));
	$page->add_regesp('{mess}',sequre($messtext));
	$page->add_regesp('{link}',
		$q->a({-href=>get_full_url({act=>'showrfcmess'})},'Switch to RFC mode')
	);
	$page->ParseData;
	$page->print;
}

######################
sub print_getfile{
	my $sql="SELECT * from ${PREF}attach WHERE pk_attach=?";
	my $out=$db->prepare($sql);
	$out->execute($PAR{id});
	&Error;
	$output=$out->fetchrow_hashref;
	print "Content-type: application/octet-stream\nContent-Disposition: attachment; filename=$output->{filename}\n\n";
	binmode(STDOUT);
	print $output->{data};
	exit();
}
######################
sub print_delfile{
	$db->do("DELETE FROM ${PREF}attach WHERE pk_attach=?",undef,$PAR{id});
	print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$PAR{reckey}&ses=$PAR{ses}");
	exit(1);
}
######################
######################
sub print_doimess{
	my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='doi'",$PAR{account});
	unless ($mess->{pk_mess}){
		my $MESS=<<ALL__;
$LNG{DOI_MESS}
ALL__
		insert_db("${PREF}mess",{mess=>"$MESS",subject=>"Please confirm your subscription",fk_account=>$PAR{account},typesend=>'doi'});	
		$mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='doi'",$PAR{account});
	}
	if ($PAR{act2} eq "preview"){
		print $q->redirect("$SCRIPT_NAME?act=showmess&account=$PAR{account}&mess=$mess->{pk_mess}&ses=$PAR{ses}");
	}else{
		print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$mess->{pk_mess}&ses=$PAR{ses}");
	}
	exit(1);
}
######################
sub print_subsmess{
	my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='subscribe'",$PAR{account});
	unless ($mess->{pk_mess}){
		insert_db("${PREF}mess",{mess=>"Your message",subject=>"Subscribe message",fk_account=>$PAR{account},typesend=>'subscribe'});	
		$mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='subscribe'",$PAR{account});
	}
	if ($PAR{act2} eq "preview"){
		print $q->redirect("$SCRIPT_NAME?act=showmess&account=$PAR{account}&mess=$mess->{pk_mess}&ses=$PAR{ses}");
	}else{
		print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$mess->{pk_mess}&ses=$PAR{ses}");
	}
	exit(1);
}
#######################
sub print_unsubsmess{
	my $mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='unsubscribe'",$PAR{account});
	unless ($mess->{pk_mess}){
		insert_db("${PREF}mess",{mess=>"Your message",subject=>"Unsubscribe message",fk_account=>$PAR{account},typesend=>'unsubscribe'});	
		$mess=select_one_db("SELECT * FROM ${PREF}mess WHERE fk_account=? AND typesend='unsubscribe'",$PAR{account});
	}
	if ($PAR{act2} eq "preview"){
		print $q->redirect("$SCRIPT_NAME?act=showmess&account=$PAR{account}&mess=$mess->{pk_mess}&ses=$PAR{ses}");
	}else{
		print $q->redirect("$SCRIPT_NAME?act=mainbody&account=$PAR{account}&act2=newmess&reckey=$mess->{pk_mess}&ses=$PAR{ses}");
	}
	exit(1);
}
########################
sub sendtoadmin{
my $to = shift;
my $messid=shift;
my $mess=load_mess($messid);
   	$msg = new MIME::Lite 
                From    =>"$CONF{fromname} <$CONF{fromemail}> ",
                To      =>"$to",
                Subject =>$mess->{subject},
                Type    =>$TYPESEND{$mess->{type}},
                Data    =>$mess->{mess}; 
	foreach (keys %{$mess->{ATTACH}}){
		my($mime)=&mimeformat($mess->{ATTACH}{$_}{filename});
		$msg->attach
			(Type =>$mime->[0],
			Encoding =>$mime->[1],
			Filename =>$mess->{ATTACH}{$_}{filename},
			Data => $mess->{ATTACH}{$_}{data},
   		);
	}
	MIMEsendto($to,$msg);
}
sub preparetodeleteauto{
	my $messid=shift;
	my @messages = @{$db->selectcol_arrayref("select pk_mess from ${PREF}mess WHERE fk_account=$PAR{account} AND  typesend = 'auto' ORDER by days ASC")};
	&Error;
	$i=0;
	my %mess;
	foreach (@messages){
		$mess{$_}=$i;
		$i++;
	}
	my $newmess;
	if ($mess{$messid}==0){
		$newmess='NULL';
	}else{
		$newmess=$messages[$mess{$messid}-1];
	}
	$db->do("UPDATE ${PREF}user SET messlastsend=$newmess WHERE messlastsend='$messid'");
	&Error;
}
#######################
sub print_account_mess{
	my $page = new hfparser(
		DATA=>$main_shabl		
	);
	$page->add_regesp('{start_broadcast}',"");
	if ($PAR{bnsettings}){
		save_config($PAR{account},"sendsubscr",$PAR{sendsubscr});
		save_config($PAR{account},"sendunsubscr",$PAR{sendunsubscr});		
		save_config($PAR{account},"isdoi",$PAR{isdoi});
	}elsif($PAR{bnRemoveAuto}){
		my @elements=$q->param('selauto');
		foreach (@elements){
			preparetodeleteauto($_);
			$db->do("DELETE FROM ${PREF}mess WHERE pk_mess='$_'");
		}
		$db->do("DELETE FROM ${PREF}attach WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		$db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		$db->do("DELETE FROM ${PREF}sentlog  WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		$db->do("DELETE FROM ${PREF}link_clicks  WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;		
	}elsif($PAR{bnRemoveDate}){
		my @elements=$q->param('seldate');
		$db->do("DELETE FROM ${PREF}mess WHERE pk_mess IN (".join(" , ",@elements).")") if @elements;
		$db->do("DELETE FROM ${PREF}attach WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		$db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		$db->do("DELETE FROM ${PREF}sentlog  WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		$db->do("DELETE FROM ${PREF}link_clicks  WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
	}elsif($PAR{bnBroadkast}){
		$page->add_regesp('{start_broadcast}',"<h1 class=\"mess\">$LNG{MESS_BROADCAST_STARTED}</h1><img src=\"$CONF{serverurl}starter.cgi\" width=\"2\" height=\"2\"> ");
		my @elements=$q->param('seldate');
		if (@elements){
			$db->do("UPDATE ${PREF}mess set issendnow=1 WHERE pk_mess IN(".join(" , ",@elements).")");			
			&Error;
		}
	}elsif($PAR{bnClearTosent}){
		my @elements=$q->param('selsent');
		if (@elements){
			$db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		}
	}elsif($PAR{bnMoveNotSent}){
		my @elements=$q->param('selsent');
		my $mess;
		$db->do("DELETE FROM ${PREF}tosend WHERE fk_mess IN (".join(" , ",@elements).")") if @elements;
		foreach  $mess(@elements){
			update_db("${PREF}mess",{typesend=>'manual',senddat=>''},{pk_mess=>$mess});
		}
	}elsif($PAR{SEND}){
		$page->set_error("sendto",$LNG{ERROR_EMAIL_INCORRECT}) unless (checkemail($PAR{sendto},0));	
		unless ($page->is_error()){
			my @elements=$q->param('selsent');
			@elements=(@elements,$q->param('seldate'));
			@elements=(@elements,$q->param('selauto'));		
			foreach (@elements){
				sendtoadmin($PAR{sendto},$_);
			}
		}
	}
        my $messtosend = GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and typesend<>'subscribe' AND typesend<>'subscribe'",$PAR{account});	
	unless($messtosend){
		$page->SplitData("<!--START_SENDTO-->","<!--END_SENDTO-->");
		$page->replaceINSIDE("");
	}
	$page->SplitData("#start#user_mess","#end#user_mess");
	$page->deleteBEFORE_AFTER();
	$page->set_def("sendsubscr",$CONF{sendsubscr});	
	$page->set_def("sendunsubscr",$CONF{sendunsubscr});	
	$page->set_def("isdoi",$CONF{isdoi});
	#############
	$automessages=GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and typesend='auto'",$PAR{account});
	$page->add_regesp('{autocount}',$automessages);
	if ($automessages){
		my $sql="SELECT pk_mess,subject,sent,days,sent FROM ${PREF}mess WHERE fk_account=? and typesend='auto' ORDER by days ASC";
		my $out=$db->prepare($sql);
		$out->execute($PAR{account});
		my $Auto;
		while (my %output=%{$out->fetchrow_hashref}){
			map{$output{$_}=sequre($output{$_})}keys %output;
			my $attach=load_mess_attachment($output{pk_mess});
			my @att=map{"<NOBR><a href=\"$SCRIPT_NAME?ses=$PAR{ses}&act=getfile&id=$_\">$attach->{$_}{filename}(". int(length($attach->{$_}{data})/100)/10 ."K)</A></NOBR>"} keys %$attach;
			my $att=join " ",@att;
			$Auto.=<<ALL__;
	  <tr class="data"> 
	    <td  ><INPUT type="checkbox" name="selauto" value="$output{pk_mess}"></td>
	    <td width="99%" >
	    <a href="$SCRIPT_NAME?reckey=$output{pk_mess}&ses=$PAR{ses}&act=mainbody&act2=newmess&account=$PAR{account}">$output{subject}</a>
	    </td>
	    <td  >$att</td>
	    <td  align="center">$output{sent}</td>
	    <td  align="center">$output{days}</td>
	    <td><a target="_blank" href="$SCRIPT_NAME?ses=$PAR{ses}&act=showmess&mess=$output{pk_mess}&account=$PAR{account}"
	    onClick="window.open('$SCRIPT_NAME?ses=$PAR{ses}&act=showmess&mess=$output{pk_mess}&account=$PAR{account}','','scrollbars=yes,resizable=yes,width=650,height=500'); return false;"	    
	    >$LNG{MESS_PREVIEW}</a></td>	    
	  </tr>
ALL__
		}
		$page->add_regesp("<!--AUTOMESS-->",$Auto);

	}else{
		$page->SplitData("<!--START_AUTO-->","<!--END_AUTO-->");
		$page->replaceINSIDE("");
	}
	################	
	$datemessages=GetSQLCount("SELECT * FROM ${PREF}mess WHERE fk_account=? and (typesend='senddat' OR typesend='manual' OR typesend='sent')",$PAR{account});
	$page->add_regesp('{datecount}',$datemessages);
	if ($datemessages){
		my $sql="SELECT pk_mess,subject,sent,days,sent,DATE_FORMAT(senddat, '%Y-%b-%d' ) as senddat FROM ${PREF}mess WHERE fk_account=? and (typesend='senddat' OR typesend='manual' OR typesend='sent') ORDER by senddat ASC";
		my $out=$db->prepare($sql);
		$out->execute($PAR{account});
		my $Auto;
		while (my %output=%{$out->fetchrow_hashref}){
			map{$output{$_}=sequre($output{$_})}keys %output;
			my $attach=load_mess_attachment($output{pk_mess});
			my @att=map{"<NOBR><a href=\"$SCRIPT_NAME?ses=$PAR{ses}&act=getfile&id=$_\">$attach->{$_}{filename}(". int(length($attach->{$_}{data})/100)/10 ."K)</A></NOBR>"} keys %$attach;
			my $att=join " ",@att;
			
my $tosent=GetSQLCount("SELECT * FROM ${PREF}tosend WHERE fk_mess=?",$output{pk_mess});
			$Auto.=<<ALL__;
	  <tr class="data"> 
	    <td  ><INPUT type="checkbox" name="seldate" value="$output{pk_mess}"></td>
	    <td width="99%">
	    	<a href="$SCRIPT_NAME?reckey=$output{pk_mess}&ses=$PAR{ses}&act=mainbody&act2=newmess&account=$PAR{account}">$output{subject}</a>
	    </td>
	    <td  >$att</td>
	    <td  align="center">$output{senddat}</td>
	    <td  align="center">$tosent</td>
	    <td  align="center">$output{sent}</td>	    
	    <td><a target="_blank" href="$SCRIPT_NAME?ses=$PAR{ses}&act=showmess&mess=$output{pk_mess}&account=$PAR{account}"
	    onClick="window.open('$SCRIPT_NAME?ses=$PAR{ses}&act=showmess&mess=$output{pk_mess}&account=$PAR{account}','','scrollbars=yes,resizable=yes,width=650,height=500'); return false;"	    
	    >$LNG{MESS_PREVIEW}</a></td>	    
	  </tr>
ALL__
		}
		$page->add_regesp("<!--DATEMESS-->",$Auto);

	}else{
		$page->SplitData("<!--START_DATE-->","<!--END_DATE-->");
		$page->replaceINSIDE("");
	}
	$page->set_def("sendto",$CONF{adminemail});	
	$page->add_regesp('{account}',$PAR{account});

	$page->ParseData;
	return $page->as_string;
}
sub print_changelink{
	my $page=new hfparser (
		DATA=>$links_shabl,
		FROM=>'#start#formlinks',TO=>'#end#formlinks'
	);
	my $link;
	my $is_new;
	if($PAR{id}){
		$link=select_one_db("SELECT * FROM ${PREF}links WHERE pk_link=?",$PAR{id});
		unless($link->{pk_link}){
			$PAR{id}="";
			$page->Hide('<!--hideifnew-->');	
			$is_new=1;
		}else{
			$is_new=0;
			$page->add_regesp('{name_link}',$link->{name});
			$page->set_def('name',$link->{name});
			$page->set_def('url',$link->{redirect_link});
			$page->Hide('<!--hideifedit-->');
		}
	}else{
		$page->Hide('<!--hideifnew-->');		
		$page->set_def('url','http://');
		$is_new=1;
	}
	if($PAR{issubmit}){
		map{$page->set_error($_,$LNG{ERROR_REQUIRED}) unless(length $PAR{$_})}qw(name url);
		$page->set_error('url',$LNG{ERROR_URL_INCORRECT}) unless check_url($PAR{url});
		unless($page->is_error){
			if($is_new){
				insert_db("${PREF}links",{name=>$PAR{name},redirect_link=>$PAR{url},fk_account=>$PAR{account}});
				&Error;
			}else{
				update_db("${PREF}links",{name=>$PAR{name},redirect_link=>$PAR{url}},{pk_link=>$PAR{id}});
			}
			print $q->redirect("$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=links&ses=$PAR{ses}");
			exit;				
		}
	}
	$page->ParseData;
	return $page->as_string;	
}
sub prepare_long_name{
	my $txt=shift;
	if (length($txt)>25){
		return substr($txt,0,25)."...";
	}else{
		return $txt;
	}
}
sub print_links_mesrospects{
	my $is_prospects=shift;
	my $page= new repparser(
		DATA=>$links_shabl,
		FROM=>'#start#prospects',TO=>'#end#prospects'
	);
	$page->set_input("emailsearch", {size=>25});
	if ($is_prospects){
		$page->Hide('<!--IS_CLICKS-->');
	}else{
		$page->Hide('<!--IS_PROSPECTS-->');
	}
	my $out1=$db->prepare("SELECT DISTINCT DATE_FORMAT( timestamp, '%M, %Y' ) as m FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess WHERE ${PREF}mess.fk_account=?") ;
	$out1->execute($PAR{account});
	$page->add_element('dateselect','',$LNG{LINKS_ALL_MONTH});
	while (my $row=$out1->fetchrow_hashref){
		$page->add_element('dateselect',$row->{m},$row->{m});
	}
	my $out1=$db->prepare("SELECT pk_mess, subject  FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess WHERE ${PREF}mess.fk_account=? GROUP by pk_mess") ;
	$out1->execute($PAR{account});
	$page->add_element('message','',$LNG{LINKS_ALL_MESS});
	&Error;
	while (my $row=$out1->fetchrow_hashref){
		$page->add_element('message',$row->{pk_mess},prepare_long_name($row->{subject}));
	}
	my $out1=$db->prepare("SELECT ${PREF}links.pk_link as pk_link, ${PREF}links.name AS name, redirect_link as url   FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess 
		LEFT JOIN ${PREF}links ON fk_link=pk_link
		WHERE ${PREF}mess.fk_account=? GROUP by pk_link") ;
	$out1->execute($PAR{account});
	$page->add_element('link','',$LNG{LINKS_ALL_LINKS});
	&Error;
	while (my $row=$out1->fetchrow_hashref){
		$page->add_element('link',$row->{pk_link},prepare_long_name("$row->{name} ($row->{url})"));
	}
	my @WHERE;
	push @WHERE,"${PREF}mess.fk_account=?";
	push(@WHERE,'DATE_FORMAT( '.$PREF.'link_clicks.timestamp, \'%M, %Y\' ) = '.$db->quote($PAR{dateselect})) if($PAR{dateselect});
	push(@WHERE,"pk_mess=".$db->quote($PAR{message})) if $PAR{message};
	push(@WHERE,"pk_link=".$db->quote($PAR{'link'})) if $PAR{'link'};
	push(@WHERE,"email LIKE(".$db->quote('%'."$PAR{'emailsearch'}".'%').")") if $PAR{'emailsearch'};

	my $where="WHERE ".join("\n AND ",@WHERE) if @WHERE;
	my $sql;
	if($is_prospects){
	$sql=<<ALL__;
	SELECT 
		${PREF}user.email as email,
		${PREF}user.pk_user as pk_user,
		${PREF}user.name as name,
		count(pk_link_click) as clicks
	FROM `${PREF}link_clicks` 
		LEFT JOIN ${PREF}mess ON pk_mess = fk_mess 
		LEFT JOIN ${PREF}links ON fk_link=pk_link
		LEFT JOIN ${PREF}user ON fk_user=pk_user
	$where  
	GROUP by pk_user
	ORDER BY clicks
ALL__
}else{
	$sql=<<ALL__;
	SELECT 
		DATE_FORMAT(${PREF}link_clicks.timestamp , \'%d/%m/%Y %H:%i\' ) as date,
		${PREF}user.email as email,
		${PREF}user.pk_user as pk_user,
		${PREF}user.name as name,
		1 as clicks
	FROM `${PREF}link_clicks` 
		LEFT JOIN ${PREF}mess ON pk_mess = fk_mess 
		LEFT JOIN ${PREF}links ON fk_link=pk_link
		LEFT JOIN ${PREF}user ON fk_user=pk_user
	$where  
	ORDER BY ${PREF}link_clicks.timestamp
ALL__

}
	my $out1=$db->prepare($sql) ;
	$out1->execute($PAR{account});
	&Error($sql);
	my $total_clicks=0;
	while (my $row=$out1->fetchrow_hashref){
		$row->{url_search}=get_links_stat_link('clicks',$PAR{message},$PAR{'link'},$row->{email});
		if($row->{pk_user}){
			$row->{url}=qq|<a href="$SCRIPT_NAME?ses=$PAR{ses}&account=$PAR{account}&act=mainbody&act2=userform&reckey=$row->{pk_user}">$LNG{TXT_VIEW}&gt;&gt;&gt;</a>|;
		}else{
			$row->{url}="&nbsp;";
		}
		$page->AddRow($row);
		$total_clicks+=$row->{clicks};
	}
	$page->add_regesp('{total_clicks}',$total_clicks);

	$page->ParseData;
	return $page->as_string;
}
sub print_links_mess{
	my $where;
	if ($PAR{dateselect}){
		$where=' AND DATE_FORMAT( timestamp, \'%M, %Y\' ) LIKE '.$db->quote($PAR{dateselect});
	}
	my $sql=<<ALL__;
SELECT 
	fk_mess AS messID, 
	IFNULL( subject, 'Unknown message' ) AS subject, 
	IFNULL( ${PREF}links.name, 'Unknown link' ) AS linkname, 
	redirect_link AS url, 
	fk_link AS linkID, 
	COUNT( pk_link_click ) AS clicks, 
	COUNT( DISTINCT fk_user ) AS prospects
FROM `${PREF}link_clicks` 
LEFT JOIN ${PREF}mess ON pk_mess = fk_mess
LEFT JOIN ${PREF}links ON pk_link = fk_link
WHERE ${PREF}mess.fk_account=? $where
GROUP BY fk_mess, fk_link
ORDER BY fk_mess, fk_link
ALL__
	my $out=$db->prepare($sql);
	$out->execute($PAR{account});
	return qq|<h1 class="mess" align="center">No logs found</h1>| unless $out->rows();
	 my $sql=<<ALL__;
SELECT 
	fk_mess AS messID, 
	COUNT( DISTINCT fk_user ) AS prospects
FROM `${PREF}link_clicks` 
LEFT JOIN ${PREF}mess ON pk_mess = fk_mess
WHERE ${PREF}mess.fk_account=? $where
GROUP BY fk_mess
ALL__
	my %mess;
 	my $out2=$db->prepare($sql);
	$out2->execute($PAR{account});	
	while(my $row=$out2->fetchrow_hashref){
		$mess{$row->{messID}}[1]=$row->{prospects};
	}
	my $page=new hfparser(
		DATA=>$links_shabl,
		FROM=>'#start#statmess',TO=>'#end#statmess'
	);
	my $out1=$db->prepare("SELECT DISTINCT DATE_FORMAT( timestamp, '%M, %Y' ) as m FROM `${PREF}link_clicks` LEFT JOIN ${PREF}mess ON pk_mess = fk_mess WHERE ${PREF}mess.fk_account=?") ;
	$out1->execute($PAR{account});
	$page->add_element('dateselect','',$LNG{LINKS_ALL_MONTH});
	while (my $row=$out1->fetchrow_hashref){
		$page->add_element('dateselect',$row->{m},$row->{m});
	}
	my $add;
	$add=" ($PAR{dateselect})" if ($PAR{dateselect});
	my $ouput=<<ALL__;
	<h2>$LNG{LINKS_MESSAGES_LINKS_ACT}$add</h2><br>
	<table width=90% align="center" cellpadding="2" cellspacing="0">
		<TR class = dataheader>
			<TD>$LNG{USR_SENT_MESSAGE}</TD>
			<TD>$LNG{ACCOUNTMENU_LINK}</TD>
			<TD align=right>$LNG{STATMENU_TOTALS_PROSPECTS}</TD>
			<TD align=right>$LNG{CLICKS}</TD>
		</TR>
ALL__
	my $messnow=undef;
	my $totalClicks=0;
	while (my $row=$out->fetchrow_hashref){
		if($row->{messID} != $messnow){
		my $l_p=get_links_stat_link('prospects',$row->{messID},undef);
		my $l_c=get_links_stat_link('clicks',$row->{messID},undef);
		$ouput.=<<ALL__;
			<TR class=data2>
				<TD colspan=2><B>$row->{subject}</B></TD>
				<TD align=right><B>$mess{$row->{messID}}[1]<a href="$l_p" title="$LNG{LINKS_VIEW_PROSP}">...</a></B></TD>
				<TD align=right><B>###CL$row->{messID}#<a href="$l_c" title="$LNG{LINKS_VIEW_CLICKS}">...</a></B></TD>
</TR>
ALL__
		$messnow=$row->{messID};
		}
		my $l_p=get_links_stat_link('prospects',$row->{messID},$row->{linkID});
		my $l_c=get_links_stat_link('clicks',$row->{messID},$row->{linkID});
		$ouput.=<<ALL__;
		<TR class=data1>
			<TD>&nbsp;</TD>
			<TD>$row->{linkname} <a href="$row->{url}" target="_blank">$row->{url}</a></TD>
			<TD align=right>$row->{prospects}<a href="$l_p" title="$LNG{LINKS_VIEW_CLICKS}">...</a></TD>
			<TD align=right>$row->{clicks}<a href="$l_c" title="$LNG{LINKS_VIEW_PROSP}">...</a></TD>
		</TR>
ALL__
		$totalClicks+=$row->{clicks};
		$mess{$row->{messID}}[0]+=$row->{clicks};
	}	
	map{$ouput=~s/###CL$_#/$mess{$_}[0]/}keys %mess;
	 my $sql=<<ALL__;
SELECT 
	fk_mess AS messID, 
	COUNT( DISTINCT fk_user ) AS prospects
FROM `${PREF}link_clicks` 
LEFT JOIN ${PREF}mess ON pk_mess = fk_mess
WHERE ${PREF}mess.fk_account=? $where
GROUP BY ${PREF}mess.fk_account
ALL__
	my $total=select_one_db($sql,$PAR{account});
	my $l_p=get_links_stat_link('prospects',undef,undef);
	my $l_c=get_links_stat_link('clicks',undef,undef);
	$ouput.=<<ALL__;
		<TR class=dataheader>
				<TD colspan=2 align=right><B>$LNG{STAT_TOTAL}:</B></TD>
				<TD align=right><B><u>$total->{prospects}</u><a href="$l_p" title="$LNG{LINKS_VIEW_PROSP}">...</a></B></TD>
				<TD align=right><B><u>$totalClicks</u><a href="$l_c" title="$LNG{LINKS_VIEW_CLICKS}">...</a></B></TD>
		</TR>	
	</table>
ALL__
	$page->add_regesp('{report}',$ouput);
	$page->ParseData;
	return $page->as_string;	
}
sub get_links_stat_link{
	my %p=%PAR;
	$p{modelog}=shift;
	$p{'message'}=shift;
	$p{'link'}=shift;
	my $email=shift;
	$p{emailsearch} = $email if $email;
	return "$SCRIPT_NAME?".join("&",map{"$_=$p{$_}"}keys%p);

}
sub print_links{
	if ($PAR{modelog} eq 'mess'){
		return &print_links_mess;
	}elsif($PAR{modelog} eq 'prospects'){
		return &print_links_mesrospects(1);
	}elsif($PAR{modelog} eq 'clicks'){
		return &print_links_mesrospects(0);
	}
	
	my $page=new repparser (
		DATA=>$links_shabl,
		FROM=>'#start#links',TO=>'#end#links'
	);
	if($PAR{'act3'} eq 'clean' && $PAR{id}){
		$db->do("DELETE FROM ${PREF}link_clicks WHERE fk_link=?",undef,$PAR{id}); &Error("Deleting links clicks");			
		OPTIMIZEtables();
		print $q->redirect("$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=$PAR{act2}&ses=$PAR{ses}");
		exit;
	}
	if($PAR{'delete'}){
		my @ID=$q->param('id');
		if(@ID){
			@ID=map{$db->quote($_)}@ID;
			my $in=join(" , ",@ID);
			$db->do("DELETE FROM ${PREF}links WHERE pk_link IN ($in)"); &Error("Deleting links");
			$db->do("DELETE FROM ${PREF}link_clicks WHERE fk_link IN ($in)"); &Error("Deleting links clicks");			
			OPTIMIZEtables();
		}
		print $q->redirect("$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=$PAR{act2}&ses=$PAR{ses}");
		exit;	
	}
	my $sql="SELECT * FROM ${PREF}links  WHERE fk_account=? ORDER BY pk_link";
	my $out=$db->prepare($sql);
	$out->execute($PAR{account});
	&Error($sql);
	my $all_count=0;
	while (my $output=$out->fetchrow_hashref){
		my $c=select_one_db("SELECT count(pk_link_click) AS count FROM ${PREF}link_clicks WHERE fk_link=?",$output->{pk_link}); 
		my $count=$c->{count} || 0;
		$all_count+=$count;
		my $u=select_one_db("SELECT count(DISTINCT fk_user) AS count FROM ${PREF}link_clicks WHERE fk_link=?",$output->{pk_link}); 
		my $u_count=$u->{count} || 0;
		my $l="<a href=\"$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=changelink&ses=$PAR{ses}&id=$output->{pk_link}\" title=\"$LNG{LINKS_CHANGE_LINK} $output->{name}\">$LNG{LINKS_CHANGE}</a>";
		my $l_cl='&nbsp;';
		$l_cl=qq|<a onClick="return confirm('Are you sure you want to delete all statistics on selected link?');" href="$SCRIPT_NAME?act=$PAR{act}&account=$PAR{account}&act2=links&act3=clean&ses=$PAR{ses}&id=$output->{pk_link}" title="Clean all statistics on link $output->{name}" >clean</a>| if $count;
		$page->AddRow({
				id=>$output->{pk_link},
				name=>$output->{name},
				url=>$output->{redirect_link},
				clicks=>$count,
				users=>$u_count,
				'link'=>$l,
				clean=>$l_cl
			});
		
	}
	my $u=select_one_db("SELECT count(DISTINCT fk_user) AS count FROM ${PREF}link_clicks LEFT JOIN ${PREF}links ON pk_link=fk_link WHERE fk_account=? GROUP BY fk_user",$PAR{account}); 
	my $u_count=$u->{count} || 0;
	$page->add_regesp('{users}',$u_count);
	$page->add_regesp('{clicks}',$all_count);
	$page->ParseData;
	return $page->as_string;	
}

#######################
sub print_account_page{
	my %map;
	%map=(	""       =>\&print_main_account_data,
		columns  =>\&print_columns,
		mess     =>\&print_account_mess,
		newmess  =>\&print_account_newmess,
		users    =>\&print_users,
		'bulk' =>\&print_users_bulk,
		'import' =>\&print_users_import,
		'export' =>\&print_users_export,
		'loadfrom'=>\&print_users_loadfrom,
		userform =>\&print_user_form,
		fieldform=>\&print_field_form,
		delfield =>\&delete_field,
		up       =>\&move_up_field,
		down     =>\&move_down_field,
		config   =>\&print_config,
		links   =>\&print_links,
		changelink   =>\&print_changelink
	);
	
	$main_page=new dparser(
		DATA=>"$SHABL_DIR/main-shabl.html"
	);
	#$main_page->add_regesp('{account_name}',$q->a({href=>get_full_url({act2=>""})},$ACCOUNT{$PAR{account}}));
	$main_page->add_regesp('{account_name}',
		"<A href=$ENV{SCRIPT_NAME}?ses=$PAR{ses}&account=$PAR{account}&act=mainbody>$ACCOUNT{$PAR{account}}</A>"
	);
	$main_page->add_regesp('{account_nm}',"$ACCOUNT{$PAR{account}}");
	my $meta = <<ALL__;
	<meta http-equiv="Content-Type" content="text/html; charset=$CONF{defcharset}">
ALL__
	$meta="" unless $CONF{defcharset};
	$main_page->add_regesp('{__META__}',$meta);
	$main_page->add_regesp('{account}',$PAR{account});
	#$main_page->add_regesp('{main_menu}',get_account_menu(\@ACCOUNTMENU));
	$main_page->add_regesp('{main_menu}',
		get_hor_menu(\@ACCOUNTMENU,{ses=>$PAR{ses},act=>$PAR{act},act2=>$PAR{act2},account=>$PAR{account}},[['menu','menuACT'],['menu2','menu2ACT']]));
	#$main_page->add_regesp('{main_menu_body}',get_full_menu(\@ACCOUNTMENU));
	my $func_ref;
	if ($map{$PAR{act2}}) {
		$func_ref=$map{$PAR{act2}};
	}else{
		$func_ref=sub{return $q->h1("Please do not experiment whith URL")}
	}
	$main_page->add_regesp('{body}',&$func_ref);
	$main_page->ParseData;
	&printheader;
	$main_page->print;	
}
####################
sub print_main{
	unless(exists($ACCOUNT{$PAR{account}})){
#		&printheader;
		print $q->redirect("http://www.silihost.hu/autoresponder.html");
		exit;
#		&printheader;
#		my $page=new dparser(
#			DATA=>"$SHABL_DIR/first.html"
#		);
#		$page->add_regesp('###VERSION##','');
#		$page->ParseData;
#		$page->print;
	}else{	
		&print_account_page;
	}

}
#########################
###accounts
sub DublicateAccountTable{
	my $table=shift;
	my $old_account=shift;
	my $new_account=shift;
	my $p_key=shift;
	my $f_key=shift;
	my $h_where=shift;
	my @where=@{$h_where};
	push @where,"$f_key=?";
	my $WHERE;
	$WHERE="WHERE ".join(" AND ",@where) if @where;
	my $sql="SELECT * FROM $table $WHERE ";
	my $out=$db->prepare($sql);
	$out->execute($old_account);
	&Error($sql);
	while (my %output=%{$out->fetchrow_hashref}){
		delete($output{$p_key});
		$output{$f_key}=$new_account;
		insert_db("$table",\%output);
	}
}
####################
sub InsertNewAccount{
	my $name=shift;
	my $target=shift;
	my $count=insert_db("${PREF}account",{name=>sequre($name),isact=>1});
	if ($PAR{target}){
		DublicateAccountTable("${PREF}conf",$PAR{target},$count,undef,"fk_account");
		DublicateAccountTable("${PREF}fields",$PAR{target},$count,"pk_fields","fk_account");
		DublicateAccountTable("${PREF}mess",$PAR{target},$count,"pk_mess","fk_account");
	}
	print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=account");
	exit(1);
}
######################
sub DeleteAccounts{
	return unless $q->param('reckey');
	my @keys=$q->param('reckey');
	@keys=map{$db->quote($_)}@keys;
	my $accounts="(".join(",",@keys).")";
	
	$db->do("DELETE FROM ${PREF}account WHERE pk_account in $accounts");
	&Error("DELETE FROM ${PREF}account WHERE pk_account in $accounts");
	$db->do("DELETE FROM ${PREF}user WHERE fk_account in $accounts");	&Error("DELETE FROM ${PREF}user WHERE fk_account in $accounts");
	my $ary_ref = $db->selectcol_arrayref("select pk_mess from ${PREF}mess WHERE fk_account in $accounts");	&Error("select pk_mess from ${PREF}mess WHERE fk_account in $accounts");
	$db->do("DELETE FROM ${PREF}attach WHERE fk_mess in (".join(",",@{$ary_ref}).")") if @{$ary_ref};
	$db->do("DELETE FROM ${PREF}tosend WHERE fk_mess in $accounts");	&Error("DELETE FROM ${PREF}tosend WHERE fk_mess in $accounts");
	$db->do("DELETE FROM ${PREF}mess WHERE fk_account in $accounts");	&Error("DELETE FROM ${PREF}mess WHERE fk_account in $accounts");
	$db->do("DELETE FROM ${PREF}conf WHERE fk_account in $accounts");	&Error("DELETE FROM ${PREF}conf WHERE fk_account in $accounts");
	my $ary_ref = $db->selectcol_arrayref("select pk_fields from ${PREF}fields WHERE fk_account in $accounts");	&Error;
	$db->do("DELETE FROM ${PREF}doppar WHERE fk_fields in (".join(",",@{$ary_ref}).")") if @{$ary_ref};
	&Error("DELETE FROM ${PREF}doppar WHERE fk_fields in (".join(",",@{$ary_ref}).")");
	my $ary_ref = $db->selectcol_arrayref("select pk_link from ${PREF}links WHERE fk_account in $accounts");	&Error;
	$db->do("DELETE FROM ${PREF}link_clicks WHERE fk_link in (".join(",",@{$ary_ref}).")") if @{$ary_ref};
	&Error("DELETE FROM ${PREF}link_clicks WHERE fk_link in (".join(",",@{$ary_ref}).")");
	$db->do("DELETE FROM ${PREF}links WHERE fk_account in $accounts");
	&Error("DELETE FROM ${PREF}links WHERE fk_account in $accounts");
	OPTIMIZEtables();
	print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=account");
	exit(1);
}
###################
sub OPTIMIZEtables{	
	foreach(@backup_tables){
		$db->do("OPTIMIZE TABLE ${PREF}$_");
		&Error;
	}
}
######################
sub InverseStatusAccounts{
	return unless $q->param('reckey');
	my @keys=$q->param('reckey');
	foreach my $key(@keys){
		$db->do("UPDATE  ${PREF}account SET isact=IF(isact=0,1,0) WHERE pk_account=$key");
		&Error;
	}
	print $q->redirect("$SCRIPT_NAME?ses=$PAR{ses}&act=account");
	exit(1);
}
####################
sub print_account{
	my %error;
	if ($PAR{bn_new}){
		my $count = GetSQLCount("SELECT * from ${PREF}account WHERE name=?",sequre($PAR{name}));
		if ($count){
			$error{name}="$LNG{ACCOUNT_EXISTS}";
		}elsif(length($PAR{name})<3 or length($PAR{name})>30){
			$error{name}="$LNG{ACCOUNT_INVALID_NAME}";
		}else{
			&InsertNewAccount($PAR{name},$PAR{target});
		}
	}
	if ($PAR{bn_delete}){
		DeleteAccounts();
	}
	if ($PAR{bn_inverse}){
		InverseStatusAccounts();
	}	
	&printheader;
	my %input,@val,%discr;
	push (@val,0);
	$discr{0}="--blank--";
	foreach (sort {$a<=>$b} keys %ACCOUNT){
		push (@val,$_); $discr{$_}=$ACCOUNT{$_};
	}
	$input{target}={default=>"0",values=>\@val,labels=>\%discr};
	$input{name}={size=>8,maxlength=>30};
	my $page=new hfparser
	DATA=>"$SHABL_DIR/accounts.html",
	INPUT=>\%input,
	ERROR=>\%error
	;
	local $OUT;
	$page->add_regesp('{account_broser}',&show_account_browser);
	&check_for_holes($page,'{ATTANTION}');
	$page->set_def(name=>"new_act");
	$page->ParseData;
	$page->print;
}
####################
sub show_account_browser{
	my $sql="SELECT * from ${PREF}account ORDER by name asc";
	my $out1=$db->prepare($sql);
	$out1->execute();
	if($out1->rows<1){
		return "<H2>$LNG{ACCOUNT_NO_ACCOUNTS}</H2>" ;
	}
	#return "Shet i'm here";	
	my $OUT=<<ALL__;
<table width="100%" border="0" cellspacing="3" cellpadding="2">
    <tr class="dataheader">
      <td width="94%" colspan="2">$LNG{ACCOUNT_YOUR_ACCOUNTS}:</td>
    </tr>
ALL__

	while (my %output=%{$out1->fetchrow_hashref}){
		my $status;
		$status=" ($LNG{ACCOUNT_DISABLED})" if ($output{isact}==0);
		
		$OUT.=<<ALL__;
	    <tr class="data">
		      <td width="3%"><input type="checkbox" name="reckey" value="$output{pk_account}"></td>
		      <td width="94%"><NOBR><a href="$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody&account=$output{pk_account}" target="main">$output{name}</a>$status</NOBR></td>
	    </tr>
ALL__
	}

	$OUT.=<<ALL__;
	<tr class="data">
	 <td colspan="2" align="center">
	  <input type="submit" value="$LNG{DEL_SELECTED}" class="buttonmy" name="bn_delete"
	   onClick="if (confirm('$LNG{ACCOUNT_DELETE_QUESTION}')==true){ goToURL('parent.frames[\\'main\\']', '$SCRIPT_NAME?ses=$PAR{ses}&act=mainbody') } else {return(false);}">	
	 </td>
	</tr>
	<tr class="data">
	<td colspan="2" align="center">
	<input type="submit" value="$LNG{ACCOUNT_INVERT_STATUS}" class="buttonmy" name="bn_inverse">
	</td></tr>
</table><BR><BR>
ALL__
return	$OUT;
}
sub check_for_holes{
	my ($page,$regesp)=@_;
	my @files=();
	my @files=<up*.cgi>;
	push(@files, 'install.cgi' ) if -f 'install.cgi';
	if (@files){
		my @badfileslist=map{"<LI><STRONG>$_</STRONG>\n"}@files;
		$page->add_regesp($regesp,$LNG{ATTANTIONFILES1}.join(" ",@badfileslist).$LNG{ATTANTIONFILES2});
	}else{
		$page->add_regesp($regesp,"");
	}
}
####################
#end accounts
####################
sub print_frameset{
	&printheader;
	my $page=new dparser
	DATA=>"$SHABL_DIR/mainframe.html"
	;
	$page->ParseData;
	$page->print;
}
#####################
#end mapping functions
#####################

