#!/usr/bin/perl


##############################################################################
# mercur pos terminals                      Version 1.00        #
###     John Jan Popovic, http://1stmuse.com
###     for Etranet
##############################################################################
use CGI qw (:standard);
use CGI::Carp qw(fatalsToBrowser);
use lib qw(.);
use CGI qw(nph);

use Encode;

use Fcntl ':flock'; # Import LOCK_* constants
use File::Copy;

$SIG{__DIE__} = sub {
    use Carp;
    my $err = shift;
    print "<pre>";
    print "ERROR: $err";
    print Carp::longmess();
    print "</pre>";
};


my $main_path;
my $root;
 
my    $server = "$ENV{'SERVER_NAME'}";


if ($server =~ /mfb-test/) {
    $main_path = '';
    $root = '/home/www/etranet_data/';
}
elsif ($server =~ /fiskal-test/) {
    $main_path = '';
    $root = '/eftposwwwroottst/HT_SAAS_eftposwwwroottst/';
}
elsif ($server=~ /eftpos-test/) {
    $root = 'C:/inetpub/wwwroot/';
    $main_path = 'http://eftpos-test.telekomcloud.hr/';
}
elsif ($server=~ /fiskalizacija/) {
    $main_path = "http://fiskalizacija.telekomcloud.hr/";
    $root = '//172.26.173.9/ht_interno_eftpos/wwwroot_production/'; # remote disk / netshare
}
else {
    $main_path = "http://loyalty.hr/";
    $root   = "$ENV{'DOCUMENT_ROOT'}";
}


# sortiranje po imenu ducana
my $MIID_SORT_OK = 1;

# CGI parametar za sortiranje Trgovina
my $MIID_SORT_CGI = '';
if ($MIID_SORT_OK) {
    $MIID_SORT_CGI = '&sort_on=2';
}


$snowtrack = "$root/mercur_backup/snowtrack.txt";
$db_bis    = "$root/mercur/bis_terminals.txt";      # Data file bis
$terminal_activity   = $root ."mercur/mercur_terminals_info.txt";
$delete_history      = "$root/mercur/mfb_deleted_terminals.txt"; 
###############################################
###                  Set Configurations Below
###############################################
### Specify database OPERE fields in the array below
@fields = (
    "TERMINAL_TID",
    "TERMINAL_CompanyID",
    "TERMINAL_ShopID",
    "TERMINAL_TIID",
    "TERMINAL_MasterKey",
    "TERMINAL_PaymentModalities",
    "TERMINAL_PriceListingFile",                     #ITEMS_FILE
    "TERMINAL_BasicParamFile",
    "TERMINAL_UsersFile",
    "TERMINAL_SerialNumber",
    "TERMINAL_Model",
    "TERMINAL_InternetConnection"

);

# TID - jedinstveniID terminala u TMS bazi
# TIID - jedinstvena oznaka terminala unutar poslovnog prostora
# MIID - oznaka pripadajućeg poslovnog prostora
# Sigurnosni master ključ
# ID pripadajućeg trgovačkog društva
# Podržani načini plaćanja
# B Pripadajuća datoteka sa parametrima
# I Pripadajuća datoteka sa cjenikom
# U Pripadajuća datoteka sa blagajnicima

$upload_1x_URL = "./$script_name?operation=upload_1x";
$upload_y_URL  = "./upload_prices.cgi";

### Set URL and email fields to be hyperlinks
### The number used corresponds to its placement in the array above
### Remeber to start your count at zero
### Leave the variables empty to remove the hyperlink
$script_name = "$ENV{'SCRIPT_NAME'}";

$homedir = $root;

### Specify the required fields below. This may be left empty
@required = ();

### Specify the filtered words below.  This may be left empty
@filter = ("word1", "word2");
$database =
  "$root/mercur/mercur_terminals.txt";    # Data file terminals name and path
$user_file = "$root/mercur/mercur_users.txt";    # User file name and path
$terminal_counter =
  "$root/mercur/counter_terminals.txt";    # Parametres file name and path

# This script name
$db_name     = "mercur - terminals";    # The database name
$table_width = "90%";                   # The display width of the entire table
$record_width          = "80%";   # The display width of the database records
$max_rows_returned     = "120";    # Max number of rows displayed per page
$filter_html_tags      = "yes";   # Removes HTML tags from record entries
$check_user_duplicates = "yes";   # Checks for duplicate user names in user file
$use_external_html     = "no";    # Set to "yes" to use your own html template
$external_html_header =
  "header.html";                  # File name and path to html template header
$external_html_footer =  "footer.html";                  # File name and path to html template footer
$authenticate     = "yes";        # Prompts users for a user name and password
$register         = "yes";        # Allows new user registration
$record_ownership = "yes";        # Users can modify/delete only their records
$admin_user_name  = "admin";      # This is the default Administrator user name
$default_user_permission_search =
  "yes";    # Gives newly registered users Search permission
$default_user_permission_add =
  "yes";    # Gives newly registered users Add permission
$default_user_permission_modify =
  "no";     # Gives newly registered users Modify permission
$default_user_permission_delete =
  "no";     # Gives newly registered users Delete permission
$defult_search_index = "0";

###############################################
###            Change Nothing Below This Line
###############################################

############## Global Viariables ##################

$q             = new CGI;
$field_count   = @fields;
$colspan       = $field_count + 1;
$EXCLUSIVE     = 2;
$UNLOCK        = 8;
$user          = $q->param(user);
$user          = $q->cookie(user) if ($user eq "");
$user_search   = $q->param(user_search);
$user_search   = "yes" if ($authenticate eq "no");
$user_add      = $q->param(user_add);
$user_add      = "yes" if ($authenticate eq "no");
$user_trans    = $q->param(user_trans);
$user_trans    = "yes" if ($authenticate eq "no");
$user_modify   = $q->param(user_modify);
$user_modify   = "yes" if ($authenticate eq "no");
$user_delete   = $q->param(user_delete);
$user_delete   = "yes" if ($authenticate eq "no");
$selected_user = $q->param(selected_user);
$admin_add     = $q->param(admin_add);
$sort          = $q->param(sort_on);
$search_for    = $q->param(search_for);

$mercur_customer = $q->param(mercur_customer);

$search_field = $q->param(search_field);
$action       = $q->param(action);
$display      = $q->param(display);
@keys         = $q->param(key);
$key          = $q->param(key);

$search_for  = $q->param(search_for);
$search_oib  = $q->param(company_oib);
$company_oib = $q->param(company_oib);
$company_id  = $q->param(company_id);

$customer_key  = $q->param(customer_key);
$key_matches   = @keys;
$search_field  = "all" if ($search_field eq "");
$search_for    = '.' if ($search_for eq "");
$action        = $q->param(which_search) if ($action =~ /^View/i);
$find_         = $q->param(find_);
$id_           = $q->param(id_);
$filter_       = $q->param(filter_);
$search_field_ = $q->param(search_field_);
$tid           = $q->param(tid);
################# Main Logic ##################
if ($q->param('operation') eq 'opere')     {$action = 'opere'}
if ($q->param('operation') eq 'logout')    {$action = 'logout'}
if ($q->param('operation') eq 'main_menu') {$action = 'Main Menu'}
if ($q->param('operation') eq 'search')    {$action = 'search'}
########

$user = 'admin';    # should be removed consequently

## loyalty.hr/cgi-bin/mercur_clients.cgi?operation=cancelcart&broj_kartice=123456

if ($q->param('operation') eq 'cancelcart') {
    $action       = 'cancelCart';
    $broj_kartice = $q->param('broj_kartice');
}

## To perform search XTROVA, click here:
## http://loyalty.hr/cgi-bin/mfb_terminals.cgi?operation=xsearch&find_=800

if ($q->param('operation') eq 'xsearch') {
    $action = 'xtrova';
    $user   = 'admin';
    my $buffer;
    my $find_ = $q->param('find_');
    $apostrophe = "%E2%80%99";
    $space      = "%20";
    $a_grave    = "%E0";
    $o_grave    = "%F2";
    $e_grave    = "\%E8";
    $e_accuto   = "\%E9";
    $u_grave    = "\%F9";

    $find_ =~ s/$space/ /g;
    $find_ =~ s/$apostrophe/\Â’/;
    $find_ =~ s/$a_grave/\Ă /g;
    $find_ =~ s/$o_grave/\Ă˛/g;
    $find_ =~ s/$e_grave/\Ă¨/g;
    $find_ =~ s/$e_accuto/\Ă©/g;
    $find_ =~ s/$u_grave/\Ăą/g;

    $find_ =~ s/^\W+//;    # - trimming leading non_alpha characters
    $find_ =~ s/\s+$//;    # - trimming trailing whitespaces
    $search_for   = $find_;
    $search_field = "all";
}

########

if ($authenticate eq "yes" && $user eq "") {&login; exit;}

if ($authenticate eq "yes") {

    # the following operations can be performed, only if AUTHENTICATION IS VALID
    if ($q->param('operation') eq 'search') {
        $action = 'search';
        my $buffer;
        my $id            = 0;
        my $filter_       = $q->param('filter_');
        my $find_         = $q->param('find_');
        my $search_field_ = $q->param('search_field_');
        my $id_           = $q->param('id_');
        my $user_         = $q->param('user_');
        $search_for   = $find_;
        $user         = $user_;
        $search_field = $search_field_;
    }

    if ($q->param('operation') eq 'main_menu') {
        $action = 'main_menu';
        my $buffer;
        my $user_ = $q->param('user_');
        $search_for = $find_;
        $user       = $user_;
    }

    if ($q->param('operation') eq 'upload_1x') {
        $action = 'upload_1x';
        my $buffer;
        my $user_ = $q->param('user_');
        $search_for = $find_;
        $user       = $user_;
    }

    if ($action =~ /new_card/i) {&increment_nx_counter; &print_add_screen;}
    elsif ($action =~ /confirm_card/i) {
        &add_record;
        $message = "Record Added";
        $title   = "Main Menu";
        &search_db($company_id, 1);
        &terminal_listing;
    }

    elsif ($action =~ /Edit_opera/i) {
        $title = "Edition Error";
        &access_problem if ($key < 1);
        &search_key($key);
        &print_modify_page;
    }
    elsif ($action =~ /GenerateParamFiles/i) {&ParametricFiles_screen($tid);}

    elsif ($action =~ /conferma_pura_modifica/i) {
        &delete_records;
        $key = $keys[0];
        &modify_record;
        $title = "Main Menu";
        &search_key($key);
        &RenamePriceFile($tid);
        &terminal_listing;
    }

    elsif ($action =~ /modify this record/i) {
        $title = "Modify";
        &delete_records;
        $key = $keys[0];
        &modify_record;
        &RenamePriceFile($tid);
        &search_key($key);
        &terminal_listing;
    }

  elsif ($action =~ /last_activities/i) {
        $title = "Last Terminal Activity";
        &search_db($company_id, 1);
        &last_activities_listing;
    }

    elsif ($action =~ /delete record/i) {
        $title = "Delete Record";
        &access_problem if ($key < 1);
        &delete_records;
        $message = "Record Updated";
        $title   = "Main Menu";
        &print_default($title, $message);
    }

# elsif($action =~ /modify/i){ &search_db($search_for); $title="Modify Which Record?"; $button_text="Modify Record"; $choose="modify"; &terminal_listing;}

    elsif ($action =~ /xtrova/i) {&intelsense_results_ajax($search_for);}

    # $title="Main Menu"; &print_default($title);
    else {
        &search_db($company_id, 1);
        $title  = "Search Results";
        $choose = "search";
        $what   = "search";
        &terminal_listing;
    }
}

exit;

#
################ Default Screen ##################
sub print_default {

    &html_header($search_oib, $company_id);
    if (($search_oib ne "") && ($company_id ne "")) {
        print <<HTML;
 Pronađeno: 0 naplatnih uređaja <br> <br>
    <input onclick="myForm.action.value='new_card';this.form.submit();" value="Dodaj novi uređaj" type="button">
HTML
    }

    &html_footer;
}    # End of print_default subroutine.

########### Search key record in Database #############
sub search_key {
    my $search_for = $_[0];

    @results = ();

    unless (-e $database) {
        open(DB, ">$database") || die "Error creating database.  $!\n";
    }
    else {open(DB, "$database") || die "Error opening database.  $!\n";}
    while (<DB>) {
        ($key, $dbuser, $when_added, @field_vals) = split(/\|/, $_);

        if ($key eq $search_for) {push @results, $_}

    }    # End of while.
    close(DB);

    @results = ();

    $count = @results;
    if ($count < 1) {
        $message = "No Matches Found For '$search_for'";
        $title   = "Main Menu";
        &print_default($title, $message);
### intervention
        exit;
    }
    $total_row_count = @results;
    if ($total_row_count > $max_rows_returned) {
        $hits_seen = $q->param(new_hits_seen);
        for ($i = 1 ; $i <= $hits_seen ; $i++) {$seen_row = shift(@results);}
        $length_of_database_rows = @results;
        for ($i = $length_of_database_rows - 1 ;
            $i >= $max_rows_returned ; $i--)
        {
            $extra_row = pop(@results);
        }
        $new_hits_seen = $hits_seen + @results;
    }
    else {$show = "no";}
}    # End of search_key subroutine.

################### Filter ####################
sub filter {
    $temp = $_[0];
    $temp =~ s/\|//g;
    $temp =~ s/\"/'/g;
    foreach $removed (@filter) {$temp =~ s/$removed/\?\$\%\&/gi;}
    if ($filter_html_tags eq "yes") {$temp =~ s/<[^>]*>//gs;}
    return ($temp);
}

################ Authenticate ################

sub authenticate {
    $form_password = $q->param(password);
    open(USERFILE, "$user_file") || die "Error opening user file.  $!\n";
    $user_matched = 0;
    while (<USERFILE>) {
        chop($_);
        ($password, $user, $u_search, $u_add, $u_modify, $u_delete) =
          split(/\|/, $_);
        if ($q->param(user) eq $user) {
            $user_matched = 1;
            $username     = $user;
            $user_add     = $u_add;
            $user_modify  = $u_modify;
            $user_search  = $u_search;
            $user_delete  = $u_delete;
            if (&auth_encrypt($form_password, $password) eq $password) {
                $cookie =
                  cookie(-NAME => 'user', -VALUE => "$user", -EXPIRES => '+3d');
            }    # End of if passwords match
        }    # End of if username matches
    }    # End of While
    close(USERFILE);
    if ($user_matched == 1 && $cookie eq "") {
        $footer        = "login";
        $title         = "Login";
        $error_message = "Your password did not match your user name!";
        &access_problem($error_message);
        exit;
    }
    if ($user_matched == 0) {
        $footer        = "login";
        $title         = "Login";
        $error_message = "Your user name was not found!";
        &access_problem($error_message);
        exit;
    }
    print header(-cookie => [$cookie]);
    $set_cookie = "yes";
    $message    = "User \"$username\" is now logged in";
    $title      = "Main Menu";
    $user       = $username;
    &print_default($title, $message);
    exit;
}

############### Register Form ################

sub register {
    $title = "Register A New User";
    &html_header($title);
    print <<HTML;
<TABLE><TR>
<TD><B>User Name</B><BR><INPUT TYPE="text" NAME="user" SIZE="30"></TD></TR>
<TR><TD><B>Password</B><BR><INPUT TYPE="password" NAME="password" SIZE="30"></TD></TR>
<TR><TD><B>Re-Type Password</B><BR><INPUT TYPE="password" NAME="password2" SIZE="30"></TD></TR>
HTML

    print <<HTML;
<TR><TD ALIGN=MIDDLE><BR>
<INPUT TYPE="hidden" NAME="search" value="$default_user_permission_search">
<INPUT TYPE="hidden" NAME="add" value="$default_user_permission_add">
<INPUT TYPE="hidden" NAME="modify" value="$default_user_permission_modify">
<INPUT TYPE="hidden" NAME="delete" value="$default_user_permission_delete">
<INPUT TYPE=button  onClick=" myForm.action.value='Add User';this.form.submit();"  VALUE="Add User" >
<INPUT TYPE=button  onClick=" myForm.action.value='Back To Login';this.form.submit();"  VALUE="Back To Login" >
</TD>
</TR>
</TABLE>
HTML
    $footer = "login";
    &html_footer;
}

################ Add User ##################

sub add_user {
    $user      = $q->param(user);
    $password  = $q->param(password);
    $password2 = $q->param(password2);
    if ($perform eq "edit" && $password eq "") {
        $use_old   = "yes";
        $password  = "$old_password";
        $password2 = "$old_password";
    }
    if ($password ne $password2 || $password eq "" || $password2 eq "") {
        $footer        = "login";
        $title         = "Register A New User";
        $error_message = "Your passwords didn't match!";
        &access_problem($error_message);
        exit;
    }
    @form_vars = ('user', 'search', 'add', 'modify', 'delete');
    foreach $x (@form_vars) {
        if ($q->param($x) eq "" || $q->param($x) =~ /\|/) {
            $footer = "login";
            $title  = "Register A New User";
            $error_message =
              "You must fill in all of the fields in the registration form!";
            &access_problem($error_message);
            exit;
        }
    }
    if ($check_user_duplicates eq "yes") {
        open(USERFILE, "$user_file");
        $user_matched = 0;
        while (<USERFILE>) {
            chop($_);
            @f = split(/\|/, $_);
            if ($f[1] eq $user) {
                $user_matched = 1;
                last;
            }
        }    # End of while userfile open
        close(USERFILE);
        if ($user_matched == 1) {
            $footer        = "login";
            $title         = "Register A New User";
            $error_message = "That user name is already taken!";
            &access_problem($error_message);
            exit;
        }    # End of user matched (found duplicate)
    }    # End of if check duplicates on
    srand(time | $$);
    $random        = "abcdefghijklmnopqrstuvwxyz1234567890";
    $real_password = $password;
    $salt          = "";
    for (1 .. 2) {$salt .= substr($random, int(rand(36)), 1);}
    if ($use_old ne "yes") {$password = &auth_encrypt($password, $salt);}
    $auth = $password;

    foreach $field (@form_vars) {
        ${$field} = $q->param($field);
        $auth .= "\|${$field}";
    }
    unless (-e $user_file) {
        open(AUTH_FILE, ">$user_file") || die "Error creating user file.  $!\n";
    }
    else {
        open(AUTH_FILE, ">>$user_file") || die "Error opening user file.  $!\n";
    }
    flock AUTH_FILE, $EXCLUSIVE;
    seek AUTH_FILE, 0, 2;
    print AUTH_FILE "$auth\n";
    flock AUTH_FILE, $UNLOCK;
    close(AUTH_FILE);
    if ($admin_add eq "") {
        $message =
          "New User Added<br>You may now login with your new user name below.";
        &login($message);
    }
    else {
        $title   = "User Manager";
        $message = "User Added/Modified";
        &user_manager($message);
    }
}

################ Create Admin ###############

sub create_admin {
    &html_header($title);
    print <<HTML;
<center><TABLE WIDTH=275>
<TR>
<TD>Please start out by setting the Administrator information below.  When logged in as the below user, you will be able to access additional options which are only available to the database administrator.</TD>
</TR><TR>
<TD><br><B>User Name:</B> $admin_user_name<br>This can be changed in the script configurations.</TD></TR>
<TR><TD><br><B>Password</B><BR><INPUT TYPE="password" NAME="password" SIZE="30"></TD></TR>
<TR><TD><B>Re-Type Password</B><BR><INPUT TYPE="password" NAME="password2" SIZE="30"></TD></TR>

<TR><TD ALIGN=MIDDLE><BR><INPUT TYPE="hidden" NAME="user" value="$admin_user_name">
<INPUT TYPE="hidden" NAME="search" value="yes">
<INPUT TYPE="hidden" NAME="add" value="yes">
<INPUT TYPE="hidden" NAME="modify" value="yes">
<INPUT TYPE="hidden" NAME="delete" value="yes">
<INPUT TYPE=button  onClick=" myForm.action.value='Add Administrator';this.form.submit();"  VALUE="Add Administrator" >
</TD>
</TR>
</TABLE></center>
HTML
    $footer = "login";
    &html_footer;
    exit;
}

################# Logout ###################

sub logout {
    $cookie = cookie(-NAME => 'user', -VALUE => "$user", -EXPIRES => '-1d');
    print header(-cookie => [$cookie]);
    $set_cookie = "yes";
    $message    = "User \"$user\" logged out";
    &login($message);
}    # end of logout

############ Encrypt Password ###############

sub auth_encrypt {
    local ($field, $salt) = @_;
    $field = crypt($field, $salt);
    $field;
}    # end of encrypt

############## Access Problem ##############

sub access_problem {
    &html_header($title);
    print <<HTML;
<BR>
<FONT SIZE=4 FACE="ARIAL" COLOR=RED><B>Error!</B></FONT><P>
<FONT SIZE=4 FACE="ARIAL">$error_message</FONT><P>
<INPUT TYPE="button" VALUE="  Back  " onClick="history.go(-1)"><br><br>
HTML
    &html_footer;
    exit;
}

################ Get Date ##################

sub get_date {
    local ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, $date);
    local (@days, @months);
    @days = (
        'Sunday',   'Monday', 'Tuesday', 'Wednesday',
        'Thursday', 'Friday', 'Saturday'
    );
    @months = (
        'January',   'February', 'March',    'April',
        'May',       'June',     'July',     'August',
        'September', 'October',  'November', 'December'
    );
    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
      localtime(time);
    if ($hour < 10) {$hour = "0$hour";}
    if ($min < 10)  {$min  = "0$min";}
    if ($sec < 10)  {$sec  = "0$sec";}
    $mon++;
    $year += 1900;
    $date = "$mday/$mon/$year at $hour\:$min\:$sec";
    return $date;
}

############ Print Next Page Buttons ###########################
sub next_page_buttons {

    if ($rows_left_to_view > 0 && $show ne "no") {
        print
"<P><INPUT TYPE=\"hidden\" NAME=\"new_hits_seen\" VALUE=\"$new_hits_seen\">\n";
        print
"<INPUT TYPE=\"hidden\" NAME=\"which_search\" VALUE=\"$which_search\">";

        if ($rows_left_to_view == 1) {
            print <<HTML;
<INPUT TYPE=button  onClick=" myForm.action.value='$what';this.form.submit();"  VALUE="View Last Record" >
HTML
        }

        if ($rows_left_to_view <= $max_rows_returned) {
            print <<HTML;
<INPUT TYPE=button  onClick=" myForm.action.value='$what';this.form.submit();"  VALUE="View Last $rows_left_to_view Records" >
HTML
        }

        if ($rows_left_to_view > $max_rows_returned) {
            print <<HTML;
<INPUT TYPE=button  onClick=" myForm.action.value='$what';this.form.submit();"  VALUE="View Next $max_rows_returned Records" >
HTML
        }


    }


}

############### backup_mercur ################
sub backup_mercur {

    # Author : John Jan Popovic
    # Date : July, 2012
    # Purpose: This procedure performs DBase adonis Backup

    # Create %adonis_hash
    %DBADONIS_hash = ();
    @DB_line       = ();
    $homedir       = $root;
    open(DB, "$database") || die "Error opening database. $! $database \n";
    @DB_line = <DB>;
    close(DB);

    foreach $adonis_record (@DB_line) {
        chomp $adonis_record;
        @altro = ();
        ($key, $dbuser, $when_added, @altro) = split(/\|/, $adonis_record);
        $DBADONIS_hash{$key} = $adonis_record;
    }

    # end of creating of %adonis_hash

    $date_time = &get_date;
    $date_time =~ s/at/~/g;
    ($date, $day_time) = split(/\~/, $date_time);
    $date =~ s/[\s]//g;
    $date =~ s/[\/]/~/g;
    ($dd, $mm, $yy) = split(/\~/, $date);

    # Format $dd,$mm numbers with up to 2 leading zeroes
    $dd = sprintf("%02d", $dd);
    $mm = sprintf("%02d", $mm);

    $backupdb =
        $root
      . "/mercur_backup/backup_clients"
      . $yy . "_"
      . $mm . "_$dd" . ".txt";

    # save ADONIS records
    my @ADONIS_line = ();
    @ADONIS_line = values(%DBADONIS_hash);

    flock DATABASE, $EXCLUSIVE;
    open(DATABASE, ">$database") or die "Error opening file: $!\n";

    foreach $adonis_line (@ADONIS_line) {
        chomp $adonis_line;
        print DATABASE "$adonis_line\n";
    }

    # backup ADONIS records
    flock DATABASE, $EXCLUSIVE;
    open(DATABASE, ">$backupdb") or die "Error opening file: $!\n";

    foreach $adonis_line (@ADONIS_line) {
        chomp $adonis_line;
        print DATABASE "$adonis_line\n";
    }

    close(DATABASE);
    flock DATABASE, $UNLOCK;

    # end of backuping ADONIS records

    # save ADONIS records
    @ADONIS_line = ();
    @ADONIS_line = values(%DBADONIS_hash);

    flock DATABASE, $EXCLUSIVE;
    open(DATABASE, ">$database") or die "Error opening file: $!\n";

    foreach $adonis_line (@ADONIS_line) {
        chomp $adonis_line;
        print DATABASE "$adonis_line\n";
    }

    close(DATABASE);
    flock DATABASE, $UNLOCK;

    # end of saving ADONIS db records

}    # End of Backup_adonis subroutine.

########### Julian day #############
sub julian_day {

# The Julian day (jd) is computed from Gregorian date, month and year (d, m, y) as follows: http://en.wikipedia.org/wiki/Julian_day
# this code will stop working after 2100 , if you use format $dd/$mm/$yy
# but it will work correctly even after 2100 , if you use format $dd/$mm/$yyyy

    use integer;
    my $datum = $_[0];
    my $jd;

    $datum =~ s/[\.\-]/\//g;    # normalise: substitute dot and dash into slash
    ($dd, $mm, $yy) = split(/\//, $datum);

    if ($yy < 100) {$yy += 2000}
    $a1 = 14 - $mm;
    $a  = $a1 / 12.0;
    $y  = $yy + 4800 - $a;
    $m  = $mm + 12 * $a - 3;
    $j1 = 153 * $m + 2;
    $jd = $dd + $j1 / 5 + 365 * $y + $y / 4 - $y / 100 + $y / 400 - 32045;

    return $jd;

}    # End of Julian day.

############### UPLOAD Screen 1/2 ################
sub print_upload_1x_page {
    $title  = "Upload Prices 1/2 ";
    $action = "upload_2x";
    if ($set_cookie eq "") {print $q->header;}

    $path_   = "$root/voltaire";
    $zy_name = "$path_/" . $prefix . "a" . $sufix . "\.jpg";
    $zy_file = $prefix . "a" . $sufix . "\.jpg";
    print <<BODY;
<HTML><HEAD>
 <TITLE>$db_name - $_[0]</TITLE>
 </HEAD><BODY BGCOLOR="#FFFFFF">
  <link rel="stylesheet" href="$main_path/js/styles_ns.css">
 <script language="javascript" src="$main_path/js/transfer_value.js"></script>
 <CENTER>
 $db_name
 <CENTER>
 <TABLE BORDER=1 WIDTH="$table_width" CELLSPACING="0" CELLPADDING="3">
 <TR> 
 <TD BGCOLOR="#e0e0e0"> 
 <CENTER> 
 <B>$title</B>
 </CENTER>
 </TD>
 </TR>
 <TR> 
 <TD align=middle><BR>

<FORM enctype="multipart/form-data" NAME="upload_1x" METHOD="post" ACTION="$upload_y_URL">

Server file:  $anno

<center>
<input type="file" name="myfile" accept="text/*" maxlength="2097152" size="60"><br>
<INPUT TYPE='submit' NAME='Submit' VALUE='UPLOAD file'>
</center>

 <BR></TD></TR>
 <TR> 
 <TD BGCOLOR="#e0e0e0"><CENTER> 
All rights reserved. 1stMuse Co
<input type=hidden name="user_search" value="">
<input type=hidden name="user_add" value="">
<input type=hidden name="user_modify" value="">
<input type=hidden name="user_delete" value="">
<INPUT TYPE="hidden" NAME="user" VALUE="">
<input type=hidden name="user_trans" value="">
<INPUT TYPE="hidden" NAME="authenticate" VALUE="yes">
<INPUT TYPE="hidden" NAME="message" VALUE=''>
<INPUT TYPE="hidden" NAME="file_name_convention" VALUE=''>
 </CENTER>
 </TD>
 </TR>
</TABLE><P>
<center><p>All rights reserved. <a href="http://www.1stmuse.com">1stMuse</a><br>&copy; MMX 1stMuse &copy; MMX JJP<br><br></center>

</BODY></HTML>

BODY

}
############# end of UPLOAD Screen 1/2 ################

############### Increment Counter ################
sub increment_nx_counter {
    open(COUNT_FILE, "+<$terminal_counter")
      || die "Error opening user file.  $!\n";
    while (<COUNT_FILE>) {
        chop($_);
        ($numero, @other_counter_fields) = split(/\|/, $_);
    };    # End of While
    seek(COUNT_FILE, 0, 0);
    $numero++;
    print COUNT_FILE ("$numero|");
    close(COUNT_FILE);
}    #  End of Increment Counter

############### RenamePriceFile ################
sub RenamePriceFile {
    use File::Copy qw(move);

    my $tid = $_[0];
    $old_name = "$root/mercur_data/new_prices.csv";
    $new_name = "$root/mercur_data/I" . $tid . ".csv";

    move $old_name, $new_name;

}    #  End of RenamePriceFile

################# FetchTERMINAL_record ###################

sub FetchTERMINAL_record {
    my $search_for    = $_[0];    # $TERMINAL_TID
    my $target_record = "";
    my @results       = ();
    my $cardId;

    $search_for =~ s/\s//g;
    $search_for =~ s/\D//g;

    open(DB, "$database") or die "Error opening database. $database $!\n";
    while (<DB>) {

        (
            $key, $dbuser, $when_added,
            $TERMINAL_TID,
            $TERMINAL_CompanyID,
            $TERMINAL_ShopID,
            $TERMINAL_TIID,

            $TERMINAL_MasterKey,
            $TERMINAL_PaymentModalities,
            $TERMINAL_PriceListingFile,
            $TERMINAL_BasicParamFile,
            $TERMINAL_UsersFile,
            $TERMINAL_SerialNumber,
            $TERMINAL_Model,
            $TERMINAL_InternetConnection
        ) = split(/\|/, $_);

        if ($TERMINAL_TID == $search_for) {push @results, $_}

    }    # End of while.
    close(DB);

    my $count = @results;
    if ($count < 1) {
        $target_record = "";
        $err_message = " . ";  # Error=100 Neregistrirani  Terminal: $search_for
    }

    if ($count > 1) {
        $target_record = "";
        $err_message =
          " . ";   # Error=101 Too many results found for TerminalId $search_for
    }

    if ($count == 1) {
        $target_record = @results[0];
        $err_message   = "";
    }

    chomp $target_record;
    return "$err_message|$target_record";
}
########### end of FetchTERMINAL_record #############

################# FetchCOMPANY_record ###################
sub FetchCOMPANY_record {
    my $search_for    = $_[0];    # $TERMINAL_CompanyID
    my $target_record = "";
    my @results       = ();

    # print "COMPANY_key .. $search_for..";

    my $database =
      "$root/mercur/mercur_companies.txt";  # Data file terminals name and path

    open(DB, "$database") or die "Error opening database. $database $!\n";
    while (<DB>) {
        (
            $key,                             $dbuser,
            $when_added,                      $COMPANY_ID,
            $COMPANY_Ime,                     $COMPANY_OIB,
            $COMPANY_Adresa_Ulica,            $COMPANY_Adresa_KucniBroj,
            $COMPANY_Adresa_KucniBrojDodatak, $COMPANY_Adresa_BrojPoste,
            $COMPANY_Adresa_Naselje,          $COMPANY_Adresa_Opcina,
            $COMPANY_FinaCertificate,         $COMPANY_CertificatePassword,
            $COMPANY_Status,                  $COMPANY_AdminUserName,
            $COMPANY_AdminPassword,           $COMPANY_U_PDVsustavu,
            $COMPANY_Message,                 $COMPANY_Logotip,
            $COMPANY_R1_R2,                   $COMPANY_ReceiptMessage
        ) = split(/\|/, $_);

        if ($COMPANY_ID == $search_for) {push @results, $_}

    }    # End of while.
    close(DB);

    my $count = @results;
    if ($count < 1) {
        $target_record = "";

        #  $err_message="Error=120 Neregistrirana tvrtka $search_for";
    }

    if ($count > 1) {
        $target_record = "";
        $err_message =
          "Error=101 Too many results found for CompanyId $search_for";
    }

    if ($count == 1) {
        $target_record = @results[0];
        $err_message   = "";
    }

    chomp $target_record;

    #print "COMPANY_record .. $target_record..";
    return "$err_message|$target_record";
}
########### end of FetchCOMPANY_record #############

################# FetchSALESMEN_records ###############
sub FetchSALESMEN_records {
    my $search_for    = $_[0];    # $TERMINAL_TID
    my $target_record = "";
    my @results       = ();

    # print "TERMINAL_TID .. $search_for..";

    my $database =
      "$root/mercur/mercur_salesmen.txt";    # salesmen file name and path

    open(DB, "$database") or die "Error opening database. $database $!\n";
    while (<DB>) {
        (
            $key,               $dbuser,
            $when_added,        $SALESMAN_CompanyID,
            $SALESMAN_ShopID,   $SALESMAN_TerminalID,
            $SALESMAN_Ime,      $SALESMAN_Oib,
            $SALESMAN_Password, $SALESMAN_MagstripeRFU
        ) = split(/\|/, $_);

        $record =
"$SALESMAN_Ime\;$SALESMAN_Oib\;$SALESMAN_Password\;$SALESMAN_MagstripeRFU";
        chomp $record;

        if ($SALESMAN_TerminalID == $search_for) {push @results, $record}

    }    # End of while.
    close(DB);

    my $count = @results;
    if ($count < 1) {
        $target_record = "";
        $err_message =
"Error=125 Nije registriran niti jedan prodavač pri terminalu: $search_for";
    }

    $target_records = "";
    if ($count >= 1) {
        $err_message = "";
        for ($ii = 0 ; $ii < $count ; $ii++) {
            $record = @results[$ii];
            chomp $record;
            $target_records .= $record . "~";
        }
    }

    chomp $target_record;

    #print "users_TID .. $target_record..";
    return "$err_message~$target_records";
}
########### end of FetchSALESMEN_records  #############

################# ParametricFiles Screen ##################

sub ParametricFiles_screen {
    my $TID = $_[0];
    $title = "Generate Parametric Files";
    &html_header($search_oib, $company_id);
    print
"Podaci za uređaj # $TID su pripremljeni. Na naplatnom uređaju provedite postupak sinkronizacije. <br>\n";
    &GenerateParametricFiles($TID);

    unless (-e $snowtrack) {
        open(SNOWTRACK, ">$snowtrack") || die "Error creating database.  $!\n";
    }
    else {
        open(SNOWTRACK, ">>$snowtrack")
          || die "Error opening database. $snowtrack\n";
    }
    flock SNOWTRACK, $EXCLUSIVE;
    seek SNOWTRACK, 0, 2;
    $when_added = &get_date;
    print SNOWTRACK
      "$user$company_id|$when_added|in mfb_terminals for tid: $TID \n";
    flock SNOWTRACK, $UNLOCK;
    close(SNOWTRACK);

    &html_footer;
}    # End of ParametricFiles_screen subroutine.

############# Results Screen TERMINALS ################
sub intelsense_results_ajax {
    my $search_for   = $_[0];
    my $search_field = 1;       # 1 look only at the field TERMINAL_ID
    use CGI qw(:standard);

# Print HTTP header for PLAIN TEXT contentType, 'Access-Control-Allow-Origin': '*',

    my $cgi = new CGI;
    print $cgi ->header(
        -type                        => 'text/plain',
        -charset                     => 'UTF-8',
        -access_control_allow_origin => '*',
    );

    unless (-e $database) {
        open(DB, ">$database") || die "Error creating database.  $!\n";
    }
    else {open(DB, "$database") || die "Error opening database.  $!\n";}
    while (<DB>) {
        ($key, $dbuser, $when_added, @field_vals) = split(/\|/, $_);

        if ($search_field =~ /all/i) {
            if (/$search_for/oi) {push @results, $_}
        }
        else {
            if ($field_vals[$search_field] =~ /$search_for/oi) {
                push @results, $_;
            }
        }    # End of else.

    }    # End of while.
    close(DB);

    foreach $curr (@results) {
        ($key, $dbuser, $when_added, @rest) = split(/\|/, $curr);
        $max  = @fields;
        $code = '$record{$key} = { key => "$key", ';
        $code .= 'dbuser => "$dbuser", ';
        $code .= 'when_added => "$when_added", ';
        for ($x = 0 ; $x < $max ; $x++) {
            $code .= "\$fields[$x] => \"\$rest[$x]\",\n";
        }    # End of for
        $code .= '};';
        eval $code;
    }    # End of foreach curr
    $sort_on = "$fields[$sort]";
    @results = ();

    foreach $rp (sort {$a->{$sort_on} cmp $b->{$sort_on}} values %record) {
        $new_rec = $rp->{key};
        $new_rec .= "\|$rp->{dbuser}";
        $new_rec .= "\|$rp->{when_added}";
        for ($x = 0 ; $x < $max ; $x++) {
            $new_rec .= "\|$rp->{$fields[$x]}";
        }    # End of for
        push @results, $new_rec;
    }    # End of foreach
    $count = @results;
    if ($count < 1) {
        $message = "No Shops Found For This Company: '$search_for'";
        print $message;
    }

    foreach $record (@results) {
        ($key, $dbuser, $when_added, @field_vals) = split(/\|/, $record);

        #assign all record variables
        $x = 0;
        foreach $field (@fields) {
            ${$field} = $field_vals[$x];
            $x++;
        }

        print "$TERMINAL_TID:$TERMINAL_CompanyID:$TERMINAL_ShopID~";

    }    # End of foreach record loop.

}    # End of intelsense_results_ajax subroutine.

############### Modify Screen ################

sub print_modify_page {
    ($key, $dbuser, $when_added, @field_vals) = split(/\|/, $results[0]);
    $title = "Modify Record";

    # print "Content-type: text/html; charset=utf8 \n\n";
    &html_header;
    print <<HTML;

  <link rel="stylesheet" type="text/css" href="../suggest/suggest.css" />
 <script type="text/javascript">
function getData(obj) {
	// finds all TDs inside obj
	var resultsTD = obj.getElementsByTagName('TD');
	// assigns TD value to form field -- formatted as -- SOCIETA (Matricola)
	document.getElementById('shop').value = 'shopID: ' +  resultsTD[0].innerHTML +  ' ('+ resultsTD[2].innerHTML + ') companyID:' + resultsTD[1].innerHTML ;
	document.getElementById('TERMINAL_ShopID').value      = resultsTD[0].innerHTML;
	// hides the DIV
	document.getElementById('shopSuggestItems').style.display = 'none';
}

function htmlFormat(results) {
	// formats results as an HTML table
	var output = '<table class="suggestList"><tbody>';
	for (var i=0;i<results.length;i++) {
		var segment = results[i].split(':');
		shop_company = segment[0];
		TERMINAL_ShopID   = segment[1];
		shop_name = segment[2];

  // Regex -- trim spaces and nondigits

  		
		output += '<tr onmouseover="this.style.backgroundColor=0xeeeeee;" onmouseout="this.style.backgroundColor=0xffffff;" onclick="getData(this)">';
		output += '<td>' + shop_company + '</td>';
		output += '<td>' + TERMINAL_ShopID + '</td>';
		output += '<td align=right class="textorange">' + shop_name + '</td>';  // right segment 
		output += '</tr>';
	}
	output += '</tbody></table>';
	return output;
}

function doSearch(searchString) {

        //alert (searchString);
	var sugItems = document.getElementById('shopSuggestItems');
	if(searchString.length>0) {
		// creates XMLHttpRequest object
		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
		}
		else if (window.ActiveXObject) {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}
		// requested results passing searchString as an URL parameter
		req.open("GET", "./mercur_shops.cgi?operation=xsearch&find_=" + searchString, true);
		req.send(null);
		// gives the request object an event handler
		req.onreadystatechange = function() {
			if ((req.readyState == 4) && (req.status == 200)) {
				// creates an array from returned list
				var results = req.responseText.split('~');
				if (results.length) {
					// formats array as an HTML table and shows the DIV
					sugItems.innerHTML = htmlFormat(results);
					sugItems.style.display = 'block';
				}
				// No items found? Hides the DIV
				else sugItems.style.display = 'none';
				return;
			};
		}
	}
	// Empty searchString? Hides the DIV
	else sugItems.style.display = 'none';
	return;
}	


</script>
 </HEAD>

<SCRIPT LANGUAGE="JavaScript">

<!-- This script locksout <CR> i.e. Enter Key and requires the SUBMIT button to be clicked to send form -->
<!-- Begin

function tabOnEnter (field, evt) {
      var keyCode = document.layers ? evt.which : document.all ? 
      evt.keyCode : evt.keyCode;
      if (keyCode != 13)
        return true;
      else {
        getNextElement(field).focus();
        return false;
      }
}


function getNextElement (field) {
    var frm = field.form;
    var bIs = false;
    for (var e=0;e<frm.length;e++)
    {
      if(frm[e].type!="hidden" && bIs) return frm.elements[e];
      if (field==frm[e]) bIs=true;
    }
}

function paymentModalities(form) {
// assign values for PAYMENT_modalities

        x1 = '';
        x2 = '';
        x3 = '';
        x4 = '';
        x5 = '';



	if (form.gotovina.checked)  {x1='G';};
	if (form.kartice.checked)   {x2='K';};
	if (form.cekovi.checked)    {x3='C';};
	if (form.transfer.checked)  {x4='T';};
	if (form.ostalo.checked)    {x5='O';};

        document.getElementById("TERMINAL_PaymentModalities").value =  x1 + x2 + x3 + x4 + x5;

// end of assign values for PAYMENT_modalities
                 
             
}
//  End -->
</script>
<body onLoad="document.getElementById('company').focus();">
<div class="tekst1" style="margin-left:20px; margin-top:25px">

 <TABLE bgcolor="#E4E4FF" border="0" WIDTH="90%" CELLSPACING="0" CELLPADDING="3" class="gray_text">
 <TR> 
 <TD BGCOLOR="#f0f0f0" > 
 <CENTER>  <B> Učitaj cjenik i Uredi parametre uređaja Mini fiskalna blagajna </B>  </CENTER>

 </TD>
 </TR>
 <TR> 
 <TD align=middle><BR>


HTML

    #assign all record variables
    $x = 0;
    foreach $field (@fields) {
        ${$field} = $field_vals[$x];
        $x++;
    }

    # Create companies_select
    $database_companies =
      "$root/mercur/mercur_companies.txt";  # Data file companies name and path

    $companies_select = qq~
<select name="TERMINAL_CompanyID" id="TERMINAL_CompanyID" onClick="document.getElementById('shop').value='';" onChange="doSearch(document.getElementById('TERMINAL_CompanyID').value);" >
   <option value="" selected > </option>
~;

    @COMPANIES_line = ();
    $homedir        = $root;
    open(COMPANIES, "$database_companies")
      || die "Error opening database. $! $database_companies \n";
    @COMPANIES_line = <COMPANIES>;
    close(COMPANIES);

    foreach $adonis_record (@COMPANIES_line) {
        chomp $adonis_record;
        @altro = ();
        ($key, $dbuser, $when_added, $company_id, $company_name, @altro) =
          split(/\|/, $adonis_record);
        $DBADONIS_hash{$key} = $adonis_record;
        if   ($TERMINAL_CompanyID == $company_id) {$selected = "selected"}
        else                                      {$selected = ""}
        $companies_select .=
qq~   <option value="$company_id" $selected> $company_id - $company_name </option>~;
    }

    $companies_select .= qq~</select>~;

    # end of creating of companies_select

    # TERMINAL_PaymentModalities settings
    if   ($TERMINAL_PaymentModalities =~ /G/) {$Gchecked = "checked"}
    else                                      {$Gchecked = ""}

    if   ($TERMINAL_PaymentModalities =~ /K/) {$Kchecked = "checked"}
    else                                      {$Kchecked = ""}

    if   ($TERMINAL_PaymentModalities =~ /C/) {$Cchecked = "checked"}
    else                                      {$Cchecked = ""}

    if   ($TERMINAL_PaymentModalities =~ /T/) {$Tchecked = "checked"}
    else                                      {$Tchecked = ""}

    if   ($TERMINAL_PaymentModalities =~ /O/) {$Ochecked = "checked"}
    else                                      {$Ochecked = ""}

    # end of TERMINAL_PaymentModalities
    $TERMINAL_UsersFile =~ s/[\r\n]//g;

    $TERMINAL_SerialNumber =~ s/[\r\n]//g;
    $TERMINAL_InternetConnection =~ s/[\r\n]//g;

    $IWL220_selected = "";
    $IWL250_selected = "";
    $ICT220_selected = "";
    $ICT250_selected = "";

    if    ($TERMINAL_Model eq "IWL220") {$IWL220_selected = "selected";}
    elsif ($TERMINAL_Model eq "IWL250") {$IWL250_selected = "selected";}
    elsif ($TERMINAL_Model eq "ICT220") {$ICT220_selected = "selected";}
    elsif ($TERMINAL_Model eq "ICT250") {$ICT250_selected = "selected"}

    $model_select = qq~
<select name="TERMINAL_Model" id="TERMINAL_Model" onkeydown="return tabOnEnter (this, event);">
   <option value="IWL220"  $IWL220_selected> IWL220</option>
   <option value="IWL250"  $IWL250_selected> IWL250</option>
   <option value="ICT220"  $ICT220_selected> ICT220</option>
   <option value="ICT250"  $ICT250_selected> ICT250</option>
</select>
~;

    $DialUp_selected = "";
    $ETH_selected    = "";
    $GPRS_selected   = "";

    if ($TERMINAL_InternetConnection eq "DialUp") {
        $DialUp_selected = "selected";
    }
    elsif ($TERMINAL_InternetConnection eq "ETH") {$ETH_selected = "selected";}
    elsif ($TERMINAL_InternetConnection eq "GPRS") {
        $GPRS_selected = "selected";
    }

    $connectivity_select = qq~
<select name="TERMINAL_InternetConnection" id="TERMINAL_InternetConnection" onkeydown="return tabOnEnter (this, event);">
   <option value="DialUp"  $DialUp_selected> DialUp</option>
   <option value="ETH"  $ETH_selected> ETH</option>
   <option value="GPRS"  $GPRS_selected> GPRS</option>
</select>
~;

    print <<HTML;


   <INPUT TYPE="hidden" NAME="key" value="$key">
   <INPUT TYPE="hidden" NAME="tid" value="$TERMINAL_TID">
<INPUT TYPE="hidden" readonly NAME="company_id" VALUE="$company_id">
<INPUT TYPE="hidden" readonly NAME="company_oib" VALUE="$company_oib">
    <TABLE BORDER=0 CELLSPACING=0>

<tbody><tr>
         <td> </td>
         <td><input name="TERMINAL_TID" value="$TERMINAL_TID" readonly size="40" onkeydown="return tabOnEnter (this, event);" type="hidden" >
</td>
         </tr>
        <tr>
         <TD> </TD>
         <td>
<input name="TERMINAL_CompanyID" value="$TERMINAL_CompanyID" readonly type="hidden" id="TERMINAL_CompanyID" 
onClick="document.getElementById('shop').value='';doSearch(document.getElementById('TERMINAL_CompanyID').value);" >
 

</td>
         </TR>

<tr>
         <TD valign="top"><B>Promjena prodajnog mjesta:</B></TD>
<TD>
<div id="shopSuggest" class="suggest">
		<input id="shop" size="60" type="text" name="shop" onClick="document.getElementById('shop').value='';doSearch(document.getElementById('TERMINAL_CompanyID').value);" autocomplete="off" />
		<div id="shopSuggestItems"></div>
</div> (Ostavi prazno ako uređaj Mini fiskalna blagajna ne mjenja trgovinu)
</TD>
</TR>

        <TR>
         <TD><B></B></TD>
<TD>
 <input name="TERMINAL_ShopID" id="TERMINAL_ShopID" size="20" type="hidden"  value="$TERMINAL_ShopID" readonly  autocomplete="off" />
</TD>
         </TR>

         <td><b>Jedinstveni identifikator terminala:</b></td>
         <td><input name="TERMINAL_TIID" value="$TERMINAL_TIID" size="40" onkeydown="return tabOnEnter (this, event);" type="text"></td>
         </tr>

         <td><b></b></td>
         <td><input name="TERMINAL_MasterKey" value="$TERMINAL_MasterKey" size="40" onkeydown="return tabOnEnter (this, event);" type="hidden"></td>
         </tr>

        <TR>
         <TD><B>Načini plaćanja:</B></TD>
         <TD>
$TERMINAL_PaymentModalities
</TD>
         </TR>


        <tr>
         <td><b></b></td>
         <td><input name="TERMINAL_PriceListingFile" value="$TERMINAL_PriceListingFile" readonly size="40"  onkeydown="return tabOnEnter (this, event);" type="hidden"></td>
         </tr>

         <td><b></b></td>
         <td><input name="TERMINAL_BasicParamFile" value="$TERMINAL_BasicParamFile"  readonly size="40" onkeydown="return tabOnEnter (this, event);" type="hidden"></td>
         </tr>
        <tr>
         <td><b></b></td>
         <td><input name="TERMINAL_UsersFile" value="$TERMINAL_UsersFile" size="40"  readonly onkeydown="return tabOnEnter (this, event);" type="hidden"></td>
         </tr>

        <TR>
         <TD><B></B></TD>
         <TD><INPUT type="hidden" NAME="TERMINAL_SerialNumber" readonly value="$TERMINAL_SerialNumber" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
       <TR>


        <TR>
         <TD><B></B></TD>
         <TD><INPUT type="hidden" NAME="TERMINAL_Model" value="$TERMINAL_Model" readonly onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
         <TD><B>Vrsta Internet veze:</B></TD>
         <TD>$TERMINAL_InternetConnection</TD>
         </TR>

       	</tbody>  
       	</TABLE>
	<BR>
<INPUT TYPE=button  onClick="myForm.key.value='$key';myForm.tid.value='$TERMINAL_TID';myForm.action.value='conferma_pura_modifica';this.form.submit();"  VALUE="Spremi" >

<input onclick="priceListing_x()" value="Učitaj cjenik" name="storage" type="button"> 

   <P>


   <P>
    <BR></TD></TR>
  <TR> 
    <TD BGCOLOR="#e0e0e0"><CENTER> 


<script type="text/javascript">
function ValueTransfer(f) {
	self.opener.document.myForm.TERMINAL_PriceListingFile.value = f;
	}


var myWind = ""

function priceListing_x() {
// either open, or put on the top if it is already existing
	if (myWind == "" || myWind.closed || myWind.name == undefined) {

           pics = window.open("$main_path/fileupload/uploadpricelist.aspx?tid=$TERMINAL_TID","subWindow","HEIGHT=200,WIDTH=620,status=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes").focus();

	} else{	myWind.focus();	}
}

function editPrices(tid){
// <input onclick="myForm.tid.value='';myForm.action.value='EditPrices';this.form.submit();" value="Edit PRICE LIST" type="button">
// either open, or put on the top if it is already existing
	if (myWind == "" || myWind.closed || myWind.name == undefined) {
 
           var url ="$main_path/cgi-bin/mercur_terminals.cgi?action=EditPrices&tid=" + tid;
           pics = window.open(url,"subWindow","HEIGHT=600,WIDTH=800,status=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes").focus();

	} else{	myWind.focus();	}
}


</script>
     </CENTER>
    </TD>
  </TR>
</TABLE><P>

</div>

HTML

    &html_footer;
}

############## HTML Header #################

sub html_header {
    print "Content-type: text/html; charset=utf8 \n\n";

    my $company_oib = $_[0];
    my $company_id  = $_[1];

    print <<WWW;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="resource-type" content="document" />
	<meta http-equiv="imagetoolbar" content="false" />
	<meta name="Description" content="INSERT DESCRIPTION" />
	<meta name="Keywords" content="INSERT KEYWORDS" />
	<meta name="Author" content="webmaster@t-com.hr" />
	<meta name="Robots" content="index,follow" />
	<link rel="Shortcut Icon" href="/images/favicon.ico" type="image/ico" />
<title>T-Hrvatski Telekom</title>

<link href="../css/prva.css" rel="stylesheet" type="text/css" media="screen" />
<link href="../css/ht.css" rel="stylesheet" type="text/css" media="screen" />



</head>

<body>
<div id="okvir">

<div id="heder">
	<div id="maliMeni">
        <ul>
            <li><a href="$web_site/cgi-bin/mfb_signin.cgi?operation=signin&company_oib=$company_oib" title="Tvrtka">Tvrtka </a></li>
            <li><a href="$web_site/cgi-bin/mfb_shops.cgi?company_id=$company_id&company_oib=$company_oib$MIID_SORT_CGI" title="Trgovine">Trgovine</a></li>
            <li><a href="$web_site/cgi-bin/mfb_terminals.cgi?company_id=$company_id&company_oib=$company_oib" title="Uređaji">Uređaji</a></li>
	        <li><a href="$web_site/cgi-bin/mfb_salesmen.cgi?company_id=$company_id&company_oib=$company_oib" title="Prodavači">Prodavači</a></li>
            <li><a href="$web_site/cgi-bin/mfb_bills.cgi?company_id=$company_id&company_oib=$company_oib"  title ="Računi">Računi</a></li>
            <li><a href="$web_site/cgi-bin/mfb_signin.cgi?operation=help&company_oib=$company_oib" title ="Podrška">Podrška</a></li>
            <li><a href="$web_site/mfb" title ="Odjava">Odjava</a></li>
        </ul>
	</div>
 <ul id="nav">
            <li><a href="$web_site/cgi-bin/mfb_signin.cgi?operation=signin&company_oib=$company_oib" title="Tvrtka">Tvrtka </a></li>
            <li><a href="$web_site/cgi-bin/mfb_shops.cgi?company_id=$company_id&company_oib=$company_oib$MIID_SORT_CGI" title="Trgovine">Trgovine</a></li>
            <li><a href="$web_site/cgi-bin/mfb_terminals.cgi?company_id=$company_id&company_oib=$company_oib" title="Uređaji">Uređaji</a></li>
	        <li><a href="$web_site/cgi-bin/mfb_salesmen.cgi?company_id=$company_id&company_oib=$company_oib" title="Prodavači">Prodavači</a></li>
            <li><a href="$web_site/cgi-bin/mfb_bills.cgi?company_id=$company_id&company_oib=$company_oib"  title ="Računi">Računi</a></li>
            <li><a href="$web_site/cgi-bin/mfb_signin.cgi?operation=help&company_oib=$company_oib" title ="Podrška">Podrška</a></li>
            <li><a href="$web_site/mfb" title ="Odjava">Odjava</a></li>
  </ul>	
</div>
<!-- top menu end -->



<style type="text/css">
<!--

SELECT {
	FONT-SIZE: 11px; COLOR: #666666; LINE-HEIGHT: normal; FONT-FAMILY: verdana, helvetica, arial
}
TEXTAREA {
	FONT-SIZE: 11px; COLOR: #666666; LINE-HEIGHT: normal; FONT-FAMILY: verdana, helvetica, arial
}
INPUT {
	FONT-SIZE: 11px; COLOR: #666666; LINE-HEIGHT: normal; FONT-FAMILY: verdana, helvetica, arial
}
OPTION {
	FONT-SIZE: 11px; COLOR: #666666; LINE-HEIGHT: normal; FONT-FAMILY: verdana, helvetica, arial
}
.gray_text {color: #555555}
-->
</style>
WWW

    &form_header;

}

############## HTML Header Mini #################
sub html_header_mini {
    my $company_oib = $_[0];
    my $company_id  = $_[1];

    print "Content-type: text/html; charset=utf8 \n\n";
    print <<WWW;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="resource-type" content="document" />
	<meta http-equiv="imagetoolbar" content="false" />
	<meta name="Description" content="INSERT DESCRIPTION" />
	<meta name="Keywords" content="INSERT KEYWORDS" />
	<meta name="Author" content="webmaster@t-com.hr" />
	<meta name="Robots" content="index,follow" />
	<link rel="Shortcut Icon" href="/images/favicon.ico" type="image/ico" />
<title>T-Hrvatski Telekom</title>

<link href="../css/prva.css" rel="stylesheet" type="text/css" media="screen" />
<link href="../css/ht.css" rel="stylesheet" type="text/css" media="screen" />

<style type="text/css">
<!--
.gray_text {color: #555555}
-->
</style>

</head>

<body>
<div id="okvir">

<div id="heder">
	<div id="maliMeni">
        <ul> 
            <li><a href="$web_site/cgi-bin/mfb_signin.cgi?operation=signin&company_oib=$company_oib" title="Tvrtka">Tvrtka </a></li>
            <li><a href="$web_site/cgi-bin/mfb_shops.cgi?company_id=$company_id&company_oib=$company_oib" title="Trgovine">Trgovine</a></li>
            <li><a href="$web_site/cgi-bin/mfb_terminals.cgi?company_id=$company_id&company_oib=$company_oib" title="Uređaji">Uređaji</a></li>
	    <li><a href="$web_site/cgi-bin/mfb_salesmen.cgi?company_id=$company_id&company_oib=$company_oib" title="Prodavači">Prodavači</a></li>
            <li><a href="$web_site/cgi-bin/mfb_bills.cgi?company_id=$company_id&company_oib=$company_oib"  title ="Računi">Računi</a></li>
            <li><a href="$web_site/mfb"  title ="Odjava">Odjava</a></li>
        </ul>
	</div>
 
</div>

<!-- top menu end -->

WWW
    &form_header;

}
############## end of HTML Header Mini #################





############## HTML Footer #################

sub html_footer {

    &form_footer;

    print <<HTML;
</form>
<!-- Footer start -->

	<div style="height:90px; width:100%; clear:both; margin:0; margin-top:75px; padding:0;background-color:transparent;background-image:url('/images/pozadinafooter.png');background-repeat:repeat-x;position:relative;">

	<div id="fusszeile">
		<div id="telekom">
		  <p>© Hrvatski Telekom, MMXIII, crafted by Etranet</p>
		</div>
		<div id="fussnavi">
				<a href="https://www.hrvatskitelekom.hr/pravne-napomene"  title="">Pravne napomene</a>
		</div>
		<div class="t-icons">					
			<a href="http://www.hrvatskitelekom.hr/privatni/" title ="Privatni korisnici">Privatni korisnici</a><a href="http://www.hrvatskitelekom.hr/poslovni/" title ="Poslovni korisnici" >Poslovni korisnici</a><a href="http://www.tportal.hr" target="_blank" title ="tportal.hr" >tportal.hr</a><a href="http://www.iskon.hr" target="_blank" title ="Iskon">Iskon</a><a href="http://www.combis.hr/" target="_blank" title ="Combis">Combis</a><a href="http://www.t.ht.hr/tis"title ="Infrastrukturne telekom usluge">Infrastrukturne telekom usluge
</a>
		</div>

	</div></div>
	&nbsp;
	<div>
	<!--GO-->

<!-- Footer end --></div>



</body>
</html>


HTML

}

############## Form Header #################

sub form_header {
    print <<HTML;
<FORM name="myForm" METHOD="post" ACTION="$script_name">
<INPUT TYPE="hidden" NAME="action" VALUE="$action">
<INPUT TYPE="hidden" readonly NAME="company_id" VALUE="$company_id">
<INPUT TYPE="hidden" readonly NAME="company_oib" VALUE="$company_oib">
<INPUT TYPE="hidden" readonly NAME="tid" VALUE="$tid">
HTML
}

############## Form Footer #################

sub form_footer {

    print "<input type=hidden name=\"user_search\" value=\"$user_search\">\n";
    print "<input type=hidden name=\"user_add\" value=\"$user_add\">\n";
    print "<input type=hidden name=\"user_modify\" value=\"$user_modify\">\n";
    print "<input type=hidden name=\"user_delete\" value=\"$user_delete\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"user\" VALUE=\"$user\">\n";
    print "<input type=hidden name=\"user_trans\" value=\"$user_trans\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"authenticate\" VALUE=\"$authenticate\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"message\" VALUE=\"$message\">\n";

}

########### Search BTerminal file TID_basic.csv #############
sub fetch_terminal_file {
    my $tid             = $_[0];
    my $err_message     = "";
    my $activity        = 1;
    my $miid_descriptor = "";

    $database_tid = "$root/mercur_data/B" . $tid . ".csv";

    my $TERMINAL_MIID;
    my $TERMINAL_PoslPr;
    my $TID_BASIC_PoslPr_Adresa;
    my $TID_BASIC_PoslPr_KucniBroj;
    my $TID_BASIC_PoslPr_KucniBrojDodatak;

    if (-e $database_tid) {
        open(DB, "$database_tid")
          or die " . "
          ; # not printed at mfb  " . \n"; # response=error 340 EFTPos terminal tid: $tid nije registriran. Ne postoji file: $database_tid
        @record = <DB>;

        (
            $TERMINAL_TID,                      $TERMINAL_Ime_tvrtke,
            $TERMINAL_OIB,                      $U_sustavu_pdv,
            $TERMINAL_MIID,                     $TERMINAL_PoslPr,
            $TID_BASIC_PoslPr_Adresa,           $TID_BASIC_PoslPr_KucniBroj,
            $TID_BASIC_PoslPr_KucniBrojDodatak, $TID_BASIC_PoslPr_BrojPoste,
            $TID_BASIC_PoslPr_Naselje,          $TID_BASIC_PoslPr_Opcina,
            $Ostali_tipovi_posl_prostora,       $TERMINAL_Radno_vrijeme,
            $TERMINAL_TIID,                     $TERMINAL_NacPl,
            $TERMINAL_Status,                   $TERMINAL_Message
        ) = split(/\;/, @record[1]);

#  00010;Etranet d.o.o.;Da;9;Etranet shop;Radnička cesta;80;B;10000;Centar;Zagreb;;Pon-Pet: 8.00-16.00;01/01/13;otvoreno;;;GKT;active;

        $TERMINAL_TID =~ s/\s//g;

        $activity = 0;

        chomp $TERMINAL_Status;
        if ($TERMINAL_Status =~ /^active/i) {$activity = 1}
        if ($TERMINAL_Status == 1)          {$activity = 1}

        $miid_descriptor = "$TERMINAL_MIID\. $TERMINAL_PoslPr";
        $err_message     = "";

        close(DB);
    }
    else {
        $err_message = ". "
          ; # error 340 EFTPos terminal tid: $tid nije registriran. Ne postoji $database_tid \n
    }

    if ($activity == 0) {
        $err_message =
          " . ";   # error 120 EFTPos terminal tid: $tid nije u aktivnom stanju.
    }

    return "$err_message~$miid_descriptor~$TERMINAL_TID";

}

# End of Search Terminals B Terminal File subroutine.


################# GenerateParametricFiles ###################
# TID_basic.cnf Generira se iz tri razlicita filea: terminals.txt, shops.txt, companies.txt
# record identification triplet: TERMINAL_TID, TERMINAL_CompanyID, TERMINAL_ShopID.

sub GenerateParametricFiles {
    my $TID = $_[0];    #
    my $TERMINAL_record;
    my $SHOP_record;

    #  assemble TID_BASIC_FILE
    $TERMINAL_record = &FetchTERMINAL_record($TID);

    (
        $error_response_t,          $key,
        $dbuser,                    $when_added,
        $TERMINAL_TID,              $TERMINAL_CompanyID,
        $TERMINAL_ShopID,           $TERMINAL_TIID,
        $TERMINAL_MasterKey,        $TERMINAL_PaymentModalities,
        $TERMINAL_PriceListingFile, $TERMINAL_BasicParamFile,
        $TERMINAL_UsersFile,        $TERMINAL_SerialNumber,
        $TERMINAL_Model,            $TERMINAL_InternetConnection
    ) = split(/\|/, $TERMINAL_record);

#  print "$TERMINAL_record <br>\n$key, $when_added TID: $TERMINAL_TID:$TERMINAL_CompanyID:$TERMINAL_ShopID: <br>TERMINAL_ShopID: ..$TERMINAL_ShopID..";

    $SHOP_record = &FetchSHOP_record($TERMINAL_ShopID);
    $SHOP_record =~ s/\;/\,/g;

    (
        $error_response_s,             $key,
        $dbuser,                       $when_added,
        $SHOP_ID,                      $SHOP_CompanyID,
        $SHOP_MIID,                    $SHOP_name,
        $SHOP_Adresa_Ulica,            $SHOP_Adresa_KucniBroj,
        $SHOP_Adresa_KucniBrojDodatak, $SHOP_Adresa_BrojPoste,
        $SHOP_Adresa_Naselje,          $SHOP_Adresa_Opcina,
        $SHOP_RadnoVrijeme,            $SHOP_DatumPocetkaPrimjene,
        $SHOP_ZatvorenoOtvoreno,       $SHOP_SpecNamj,
        $SHOP_OstaliTipoviPoslProstora
    ) = split(/\|/, $SHOP_record);

    #   print $SHOP_record;

    $COMPANY_record = &FetchCOMPANY_record($TERMINAL_CompanyID);
    $COMPANY_record =~ s/\;/\,/g;

    (
        $error_response_c,            $key,
        $dbuser,                      $when_added,
        $COMPANY_ID,                  $COMPANY_Ime,
        $COMPANY_OIB,                 $COMPANY_Adresa_Ulica,
        $COMPANY_Adresa_KucniBroj,    $COMPANY_Adresa_KucniBrojDodatak,
        $COMPANY_Adresa_BrojPoste,    $COMPANY_Adresa_Naselje,
        $COMPANY_Adresa_Opcina,       $COMPANY_FinaCertificate,
        $COMPANY_CertificatePassword, $COMPANY_Status,
        $COMPANY_AdminUserName,       $COMPANY_AdminPassword,
        $COMPANY_U_PDVsustavu,        $COMPANY_Message,
        $COMPANY_Logotip,             $COMPANY_R1_R2,
        $COMPANY_ReceiptMessage
    ) = split(/\|/, $COMPANY_record);

    #print "$COMPANY_U_PDVsustavu, $COMPANY_Message, $COMPANY_R1_R2 <br>";

    $error_responseX =
      $error_response_t . $error_response_s . $error_response_c;

    if ($error_responseX eq "") {
        $TID_basic_header =
qq|TID;ImeTvrtke;OIB;U sustavu pdv;MIID;PoslPr;Ulica;KucniBroj;KucniBrojDod;Posta;Naselje;Opcina;Ostali tipovi posl prostora;RadnoVrijeme;TIID;NacinPlacanja;Status;CompanyMessage;R1_R2;ReceiptMessage;adminPassword|;

## MIID proactive Ingenico parsing patch ###########
        $SHOP_MIID =~ s/\W//g;    # strip all iregular characters
        if ($SHOP_MIID eq "") {$SHOP_MIID = "0"}

## EU SHOP_name rules patch ###############
        $SHOP_name_complex = $SHOP_name . ", ";
        $SHOP_name_complex .= $SHOP_Adresa_Ulica . " ";
        $SHOP_name_complex .= $SHOP_Adresa_KucniBroj . " ";
        $SHOP_name_complex .= $SHOP_Adresa_KucniBrojDodatak . ", ";
        $SHOP_name_complex .= $SHOP_Adresa_BrojPoste . " ";
        $SHOP_name_complex .= $SHOP_Adresa_Naselje;

        if ($SHOP_OstaliTipoviPoslProstora eq "pokretna_prodaja") {
            $SHOP_name_complex = $SHOP_name;
        }

## MIID proactive Ingenico parsing patch ###########
        $SHOP_MIID =~ s/\W//g;    # strip all iregular characters
        if ($SHOP_MIID eq "") {$SHOP_MIID = "0"}

## EU VAT exemption rules patch ###############
        $prefix_message =
          "oslobođeno plaćanja PDV-a prema članku 90 / Zakon o PDV-u ";
        if ($COMPANY_U_PDVsustavu == 0) {$prefix_message = "";}
        $ReceiptMessage_complex = $prefix_message . $COMPANY_ReceiptMessage;

        $COMPANY_U_PDVsustavu =~ s/\;//g;
        $SHOP_MIID =~ s/\;//g;

        $activity_status =
          terminal_activity_status($COMPANY_Status, $TERMINAL_Status);

        $COMPANY_Message_complex = $COMPANY_Message;
        if ($activity_status eq "disabled") {
            $COMPANY_Message_complex =
              "Privremeno isključena Mini fisklana blagajna";
        }

        $TID_basic_record = $TERMINAL_TID;
        $TID_basic_record .= ";" . $COMPANY_Ime;

        #	  $TID_basic_record .=";HR" . $COMPANY_OIB; # country code prefix
        $TID_basic_record .= ";" . $COMPANY_OIB;
        $TID_basic_record .= ";" . $COMPANY_U_PDVsustavu;
        $TID_basic_record .= ";" . $SHOP_MIID;
        $TID_basic_record .= ";" . $SHOP_name_complex;   # $SHOP_name # previous
        $TID_basic_record .= ";" . $COMPANY_Adresa_Ulica;
        $TID_basic_record .= ";" . $COMPANY_Adresa_KucniBroj;
        $TID_basic_record .= ";" . $COMPANY_Adresa_KucniBrojDodatak;
        $TID_basic_record .= ";" . $COMPANY_Adresa_BrojPoste;
        $TID_basic_record .= ";" . $COMPANY_Adresa_Naselje;
        $TID_basic_record .= ";" . $COMPANY_Adresa_Opcina;
        $TID_basic_record .= ";" . $SHOP_OstaliTipoviPoslProstora;

        $SHOP_RadnoVrijeme29 = $SHOP_RadnoVrijeme;
        if (length($SHOP_RadnoVrijeme) > 29) {
            $SHOP_RadnoVrijeme29 = substr($SHOP_RadnoVrijeme, 0, 28);
        }

        $TID_basic_record .= ";" . $SHOP_RadnoVrijeme29;

        $TID_basic_record .= ";" . $TERMINAL_TIID;
        $TID_basic_record .= ";" . $TERMINAL_PaymentModalities;
        $TID_basic_record .= ";" . $activity_status;    # Suspenzija blagajne
        $TID_basic_record .= ";" . $COMPANY_Message_complex;
        $TID_basic_record .= ";" . $COMPANY_R1_R2;
        $TID_basic_record .= ";" . $COMPANY_ReceiptMessage;
        $TID_basic_record .= ";" . $COMPANY_AdminPassword;

        $TID_basic_record =~ s/\;\;/\; \;/g
          ; # consecutive semicolon prevention / insert blank between consecutive semicolons

        #  print TID_BASIC_FILE
        $TID_basic_file =
            "$root/mercur_data/B"
          . $TERMINAL_TID
          . ".csv";    # Data file companies name and path
        open(TID_BASIC_FILE, ">$TID_basic_file")
          || die "Error opening user file. $TID_basic_file  $!\n";
        print TID_BASIC_FILE ("$TID_basic_header\n");
        print TID_BASIC_FILE ("$TID_basic_record\n");
        close(TID_BASIC_FILE);

        #  End of TID_BASIC_FILE

        # put B Marker file
        # $TID_marker_B = "$root/mercur_markers/B_MARKER" . $TERMINAL_TID;
        # open(TID_MARKER, ">$TID_marker_B")  || die "Error opening user file. $TID_marker_B  $!\n";
        # close(TID_MARKER);

    }
    else {
        # report error
        print "$error_response_t . $error_response_s .  $error_response_c";
    }

    #  end of assembling TID_BASIC_FILE

    #  assembling TID_UsersFile
    my @USERS_records = ();
    $USERS_records_and_error = &FetchSALESMEN_records($TID);
    ($error_response_u, @USERS_records) = split(/\~/, $USERS_records_and_error);
    $TID_users_header = qq|Ime i prezime trgovca;OIB trgovca;Lozinka;Mastripe|;

    if ($error_response_u eq "") {
        print
"\n<br>**************************** USERS_FILE ****************************<br>";
        $TID_users_file = "$root/mercur_data/U" . $TERMINAL_TID . ".csv";
        open(TID_USERS_FILE, ">$TID_users_file")
          || die "Error opening user file. $TID_users_file  $!\n";
        chomp $TID_users_header;
        print TID_USERS_FILE ("$TID_users_header\n");
        foreach $users_record (@USERS_records) {
            chomp $users_record;
            print TID_USERS_FILE ("$users_record\n");
            print("$users_record<br>\n");
        }
        print
"\n<br>****************************** ********** ****************************<br>";
        close(TID_USERS_FILE);

        #  End of TID_USERS_FILE

        # put U Marker file
        # $TID_marker_U = "$root/mercur_markers/U_MARKER" . $TERMINAL_TID;
        #open(TID_MARKER, ">$TID_marker_U")  || die "Error opening user file. $TID_marker_U   $!\n";
        #close(TID_MARKER);

  

    }
    else {
        # report error
        print "$error_response_u";
    }

    &validify_pricelist($TERMINAL_TID);

    #  end of assembling TID_UsersFile

}    # ########## end of GenerateParametricFiles  #############

################# validify_pricelist ###################

sub validify_pricelist {
    my $tid      = $_[0];    # $TERMINAL_TID
    my @clean    = ();
    my @overflow = ();

    my %grupa_hash    = ();
    my %grupa_index   = ();
    my @grupa_arrival = ();
    my $max_groups    = 11;
    my $max_items     = 500;

# Grupa    ;Sifra   ;Naziv        ;JedMjere         ;Cijena              ;StopaPDV          ;StopaPNP        ;PDVFree              ;Povratna naknada    ;Iznos povratne naknade   ;PorezOstalo1      ;StopaPorezOstalo1;PorezOstalo2;StopaPorezOstalo2;PorezOstalo3;StopaPorezOstalo3
# Grupa: 29;Šifra: 9;Naziv: 59    ;Jedinica mjere: 9;Cijena :    10      ; StopaPDV   2     ;StopaPNP  2     ;PDVFree  2   (da|ne) ;Povratna naknada: 59;Iznos povratne naknade :5;Porezi (naziv): 59;

    print
"<br><br><br>*******************   PRICE LIST ITEMS   ***********************<br><br>\n";
    $pricelist = "$root/mercur_data/I" . $tid . ".csv";

    ## loading
    if (-e $pricelist) {
        $grupa_counter = 0;
        open(ITEMS, "$pricelist")
          or die "Error opening database. $pricelist $!\n";
        while (<ITEMS>) {

            $Naziv  = "";
            $record = $_;
            chomp $record;
            $record .=
';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'
              ;    # autoadjustment for missing right colons in I file

            my (
                $Grupa,           $Sifra,
                $Naziv,           $JedMjere,
                $Cijena,          $StopaPDV,
                $StopaPNP,        $PDVFree,
                $Povratnanaknada, $Iznospovratnenaknade,
                $PorezOstalo1,    $StopaPorezOstalo1,
                $PorezOstalo2,    $StopaPorezOstalo2,
                $PorezOstalo3,    $StopaPorezOstalo3,
                @altro
            ) = split(/\;/, $record);

            if ($JedMjere !~ /mjere/) {
                $Grupa =~ s/\s+$//g;
                $Grupa =~ s/^\s+//g;

                $Grupa29 = $Grupa;
                if (length($Grupa29) > 29) {
                    $Grupa29 = substr($Grupa29, 0, 29);
                }

                $Sifra9 = $Sifra;
                if (length($Sifra9) > 9) {
                    $Sifra9 = substr($Sifra9, 0, 9);
                }

                $Naziv59 = $Naziv;
                if (length($Naziv59) > 59) {
                    $Naziv59 = substr($Naziv59, 0, 59);
                }

                $JedMjere9 = $JedMjere;
                if (length($JedMjere9) > 9) {
                    $JedMjere9 = substr($JedMjere9, 0, 9);
                }

                $Cijena =~ s/\,/\./g;
                $Cijena =~ s/\.(?=\d{3})//g
                  ; # trim dot as thousand separator / (dosta korisnika koristi točku kao razdjeljnik između tisućica i stotica npr. 3.500.00)

                if ($Cijena =~ /\d/) {
                    $Cijena = sprintf("%.2f", $Cijena);
                    $I_record =
qq~$Grupa29\;$Sifra9\;$Naziv59\;$JedMjere9\;$Cijena\;$StopaPDV\;$StopaPNP\;$PDVFree\;$Povratnanaknada\;$Iznospovratnenaknade\;~;
                    $I_record .=
qq~$PorezOstalo1\;$StopaPorezOstalo1\;$PorezOstalo2\;$StopaPorezOstalo2\;$PorezOstalo3\;$StopaPorezOstalo3~;

                    $grupa_hash{$Grupa}++;
                    if ($grupa_hash{$Grupa} == 1) {

                        # first arrived, first served policy

                        $grupa_index{$Grupa} = $grupa_counter;
                        @grupa_arrival[$grupa_counter] = $Grupa;
                        $grupa_counter++;
                    }

                    if ($grupa_hash{$Grupa} < $max_items) {
                        push @clean, $I_record;
                    }
                    else {
                        push @overflow, $I_record;
                    }
                }
            }

            # print "$_<br>";

        }    # End of while.
        close(ITEMS);
        ## end of loading

###
        # GROUP TABLE
        print qq~
<br>
<table border="0" cellpadding="4" cellspacing="2" bgcolor="#FFFFCC" > 

  <tbody>
    <tr bgcolor="eeeeee">
    <td>  </td>
    <td> Vaš cjenik prije obrade</td>
    <td> </td>
  </tr>
    <tr bgcolor="eeeeee">
    <td> Grupa&nbsp;&nbsp  </td>
    <td> broj artikala u grupi</td>

    <td>index</td>
  </tr>
~;

        my $n_groups = $grupa_counter;
        for ($i = 0 ; $i <= $n_groups ; $i++) {
            $grupa = @grupa_arrival[$i];

            print qq~
    <tr bgcolor="eeeeee">
       <td> $grupa </td>
       <td> $grupa_hash{$grupa}</td>
       <td> $grupa_index{$grupa}</td>
     </tr>
~;

        }

        $n_groups--;

        print qq~
    <tr bgcolor="eeeeee">
       <td> UKUPNO GRUPA &nbsp  </td>
       <td> $n_groups </td>
       <td></td>
     </tr>
  </table>

  <br>
 
~;

        if ($n_groups > $max_groups) {
            print
qq~ <p class="textorange"> ERROR: Vaš cjenik sadrži više od $max_groups grupa! POZOR: MFB Cjenik može sadržavati najviše $max_groups grupa, a svaka grupa moze sadržavati najviše 500 artikala. </p>~;
        }

        # end of GROUP TABLE

        # table header
        print qq~

<table border="0" cellpadding="4" cellspacing="2" bgcolor="#FFFFCC" > 

  <tbody>
    <tr bgcolor="eeeeee">
    <td> Grupa&nbsp;&nbsp;:29 </td>
    <td> Sifra&nbsp;&nbsp;:9</td>
    <td> Naziv&nbsp;&nbsp;:59</td>
    <td> JedMjere&nbsp;&nbsp;:9</td>
    <td  align="right"> Cijena&nbsp;&nbsp;:10</td>
    <td  align="right">StopaPDV&nbsp;&nbsp;:2</td>
    <td  align="right">StopaPNP&nbsp;&nbsp;:5</td>
    <td>PDVFree&nbsp;&nbsp;:2</td>
    <td>Povratna naknada&nbsp;&nbsp;:59</td>
    <td>Iznos povratne naknade&nbsp;&nbsp;:5</td>
    <td>PorezOstalo1</td>
    <td>StopaPorezOstalo1</td>
    <td>PorezOstalo2</td>
    <td>StopaPorezOstalo2</td>
    <td>PorezOstalo3</td>
    <td>StopaPorezOstalo3</td>
    <td></td>
  </tr>
~;

        open(ITEMS, ">$pricelist")
          or die "Error opening database. $pricelist $!\n";
        $pricelist_header =
qq~Grupa;Sifra;Naziv;JedMjere;Cijena;StopaPDV;StopaPNP;PDVFree;Povratna naknada;Iznos povratne naknade; PorezOstalo1;StopaPorezOstalo1;PorezOstalo2;StopaPorezOstalo2;PorezOstalo3;StopaPorezOstalo3~;
        print ITEMS "$pricelist_header\n";    # PRICE LIST header

        foreach $record (@clean) {
            $record =~ s/\,/\./;
            $record =~ s/\%//;

            my (
                $Grupa,           $Sifra,
                $Naziv,           $JedMjere,
                $Cijena,          $StopaPDV,
                $StopaPNP,        $PDVFree,
                $Povratnanaknada, $Iznospovratnenaknade,
                $PorezOstalo1,    $StopaPorezOstalo1,
                $PorezOstalo2,    $StopaPorezOstalo2,
                $PorezOstalo3,    $StopaPorezOstalo3
            ) = split(/\;/, $record);

            if ($grupa_index{$Grupa} <= $max_groups)
            {  # ograničiti korisnicima da dodavaju više od 10 grupa u cijenik

                #  error detection
                $Grupa_bg = "";
                if (length($Grupa) > 29) {$Grupa_bg = "#FF6633";}

                $Sifra_bg = "";
                if (length($Sifra) > 9) {$Sifra_bg = "#FF6633";}

                $Naziv_bg = "";
                if (length($Naziv) > 59) {$Naziv_bg = "#FF6633";}

                $JedMjere_bg = "";
                if (length($JedMjere) > 9) {$JedMjere_bg = "#FF6633";}

                $Cijena_bg = "";
                $Cijena =~ s/\,/\./g;
                $Cijena =~ s/\.(?=\d{3})//g
                  ; # trim dot as thousand separator / (dosta korisnika koristi točku kao razdjeljnik između tisućica i stotica npr. 3.500.00)

                if ($Cijena =~ /[\d\.]/) {
                    $Cijena = sprintf("%.2f", $Cijena);
                }
                else {
                    $Cijena_bg = "#FF6633";
                }

                if (length($Cijena) > 10)      {$Cijena_bg = "#FF6633";}
                if ($Cijena !~ /\d*(\.\d+)?$/) {$Cijena_bg = "#CC3333";}

                $StopaPDV_bg = "";
                $StopaPDV =~ s/\s//g;
                if (length($StopaPDV) > 2) {$StopaPDV_bg = "#FF6633";}
                if ($StopaPDV =~ /[\D]/)   {$StopaPDV_bg = "#CC3333";}
                if ($StopaPDV =~ /\.\d\d/) {$StopaPDV_bg = "";}
                if ($StopaPDV eq "")       {$StopaPDV_bg = "";}

                $StopaPNP_bg = "";
                $StopaPNP =~ s/\s//g;
                $StopaPNP =~ s/\,/\./;
                if (length($StopaPNP) > 5) {$StopaPNP_bg = "#FF6633";}
                if ($StopaPNP =~ /[\D]/)   {$StopaPNP_bg = "#CC3333";}
                if ($StopaPNP =~ /\.\d\d/) {$StopaPNP_bg = "";}
                if ($StopaPNP eq "")       {$StopaPNP_bg = "";}

                $PDVFree_bg = "";
                if (length($PDVFree) > 2) {$PDVFree_bg = "#FF6633";}
                if ($PDVFree !~ /da|ne/i) {$PDVFree_bg = "#CC3333";}

                #  end of error detection

                print qq~

  <tr>
    <td bgcolor="$Grupa_bg">$Grupa</td>
    <td bgcolor="$Sifra_bg">$Sifra</td>
    <td bgcolor="$Naziv_bg">$Naziv</td>
    <td bgcolor="$JedMjere_bg"> $JedMjere</td>
    <td align="right" bgcolor="$Cijena_bg">$Cijena</td>
    <td  align="right" bgcolor="$StopaPDV_bg">$StopaPDV</td>
    <td  align="right" bgcolor="$StopaPNP_bg">$StopaPNP</td>
    <td  bgcolor="$PDVFree_bg">$PDVFree</td>
    <td>$Povratnanaknada</td>
    <td>$Iznospovratnenaknade</td>
    <td>$PorezOstalo1</td>
    <td>$StopaPorezOstalo1</td>
    <td>$PorezOstalo2</td>
    <td>$StopaPorezOstalo2</td>
    <td>$PorezOstalo3</td>
    <td>$StopaPorezOstalo3</td>
  </tr>
~;

                $record =~
                  s/\s+\;/\;/g;    #trim trailing spaces before the semicolon
                print ITEMS "$record\n";  # resave the cleaned PRICE LIST record
                $Grupa =~ s/\s+$//g;
                $Grupa =~ s/^\s+//g;
                $grupa_hash{$Grupa}++;

                $Cijena =~ s/\,/\./g;

            }
        }
        print ITEMS "\n";
        close(ITEMS);
    }

    print qq~</table>~;
    print
"<br><br><br>*******************  Edit PRICE LIST ITEMS   ***********************<br><br>\n";
    print
qq~<input onclick="myForm.tid.value='$tid';myForm.action.value='EditPrices';this.form.submit();" value="Edit PRICE LIST ITEMS" type="button">~;

}
########### end of validify_pricelist NEW #############


########### Search & Sort Database #############
sub search_db {
    my $search_for = shift;
   
    # global var, set to empty 
    @results=();

    my $DB;
    unless (-e $database){ 
        open ($DB, ">", $database) or die "Error creating database.  $!\n"; 
    }
    else { 
        open ($DB, "<", $database) or die "Error opening database.  $!\n"; 
    }

    while (my $row = <$DB>) {
        my ($k, $dbuser, $when_added, $tid, $company_id, @resto) = split(/\|/, $row);
        if ($company_id == $search_for) {
            my $term = fetch_terminal_file($tid);  
            push @results, {
                row => $row,
                tid => $tid,
                term => $term,
            };
        }
    } 
    close ($DB);

    my $count = @results;
    if ($count < 1) { 
        $message = "No Matches Found For '$search_for'";
        $title = "Main Menu";
        print_default($title, $message);  
        
        ### intervention
        exit;
    }
    $total_row_count = @results;
    if ($total_row_count > $max_rows_returned) {
        $hits_seen = $q->param('new_hits_seen');
        
        # omit last undefined items
        @results = grep defined, @results;
        # sort whole resultset before limiting! 
        if ($MIID_SORT_OK) {
            @results = sort by_miid @results;
        }
        # limit resultset to $max_rows_returned items
        @results = @results[$hits_seen .. ($hits_seen + $max_rows_returned - 1)];

        $new_hits_seen = $hits_seen + @results; 
    } 
    else { 
        $show = "no"; 
    }
} # End of search_db subroutine.





################# Add Screen: Add new Card ##################

sub print_add_screen {
    $title = "Add new Card";

    &html_header_mini($search_oib, $company_id);
    print <<HTML;
<HEAD>
 <meta http-equiv="content-type" content="text/html;  charset=utf8">
 <TITLE>mercur - terminals - Add new Card</TITLE>
  <link rel="stylesheet" href="../js/styles_ns.css">
  <link rel="stylesheet" type="text/css" href="../suggest/suggest.css" />


 <script type="text/javascript">
function getDataCompany(obj) {

        // next focus
        document.getElementById('shop').focus();
        doSearch($company_id);
}

function htmlFormatCompany(results) {
    // formats results as an HTML table
    var output = '<table class="suggestList"><tbody>';
    for (var i=0;i<results.length;i++) {
        var segment = results[i].split(':');
        company_id = segment[0];
        company_name   = segment[1];
        company_oib  = segment[2];

  // Regex -- trim spaces and nondigits

        
        output += '<tr onmouseover="this.style.backgroundColor=0xeeeeee;" onmouseout="this.style.backgroundColor=0xffffff;" onclick="getDataCompany(this)">';
        output += '<td>' + company_id + '</td>';
        output += '<td>' + company_name + '</td>';
        output += '<td align=right class="textorange">' + company_oib + '</td>';  // right segment 
        output += '</tr>';
    }
    output += '</tbody></table>';
    return output;
}

function doSearchCompanyId(searchString) {


    return;
}   

</script>



 <script type="text/javascript">
function getData(obj) {
    // finds all TDs inside obj
    var resultsTD = obj.getElementsByTagName('TD');
    // assigns TD value to form field -- formatted as -- 
    document.getElementById('shop').value = 'shopID: ' +  resultsTD[0].innerHTML +  ' ('+ resultsTD[2].innerHTML + ') companyID:' + resultsTD[1].innerHTML ;
    document.getElementById('TERMINAL_ShopID').value      = resultsTD[0].innerHTML;
    // hides the DIV
    document.getElementById('shopSuggestItems').style.display = 'none';
        
}

function htmlFormat(results) {
    // formats results as an HTML table
    var output = '<table class="suggestList"><tbody>';
    for (var i=0;i<results.length;i++) {
        var segment = results[i].split(':');
        shop_company = segment[0];
        TERMINAL_ShopID   = segment[1];
        shop_name = segment[2];

  // Regex -- trim spaces and nondigits

        
        output += '<tr onmouseover="this.style.backgroundColor=0xeeeeee;" onmouseout="this.style.backgroundColor=0xffffff;" onclick="getData(this)">';
        output += '<td>' + shop_company + '</td>';
        output += '<td>' + TERMINAL_ShopID + '</td>';
        output += '<td align=right class="textorange">' + shop_name + '</td>';  // right segment 
        output += '</tr>';
    }
    output += '</tbody></table>';
    return output;
}

function doSearch(searchString) {

    var sugItems = document.getElementById('shopSuggestItems');
    if(searchString.length>0) {
        // creates XMLHttpRequest object
        if (window.XMLHttpRequest) {
            req = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        // requested results passing searchString as an URL parameter
        req.open("GET", "./mercur_shops.cgi?operation=xsearch&find_=" + searchString, true);
        req.send(null);
        // gives the request object an event handler
        req.onreadystatechange = function() {
            if ((req.readyState == 4) && (req.status == 200)) {
                // creates an array from returned list
                var results = req.responseText.split('~');
                if (results.length) {
                    // formats array as an HTML table and shows the DIV
                    sugItems.innerHTML = htmlFormat(results);
                    sugItems.style.display = 'block';
                }
                // No items found? Hides the DIV
                else sugItems.style.display = 'none';
                return;
            };
        }
    }
    // Empty searchString? Hides the DIV
    else sugItems.style.display = 'none';
    return;
}   


</script>
 </HEAD>

<SCRIPT LANGUAGE="JavaScript">

<!-- This script locksout <CR> i.e. Enter Key and requires the SUBMIT button to be clicked to send form -->
<!-- Begin

function tabOnEnter (field, evt) {
      var keyCode = document.layers ? evt.which : document.all ? 
      evt.keyCode : evt.keyCode;
      if (keyCode != 13)
        return true;
      else {
        getNextElement(field).focus();
        return false;
      }
}


function getNextElement (field) {
    var frm = field.form;
    var bIs = false;
    for (var e=0;e<frm.length;e++)
    {
      if(frm[e].type!="hidden" && bIs) return frm.elements[e];
      if (field==frm[e]) bIs=true;
    }
}


                 
             
}
//  End -->
</script>
<body>





<P>
 <CENTER>
 <TABLE BORDER=0 WIDTH="90%" CELLSPACING="0" CELLPADDING="3">
 <TR> 
 <TD BGCOLOR="#e0e0e0" align="right"> 
 <CENTER>  <B>Ingenico Terminal Data</B>  </CENTER>

 </TD>
 </TR>
 <TR> 
 <TD align=middle><BR>

HTML
##### Read terminal Counter
    open(COUNT_FILE, "+<$terminal_counter")
      || die "Error opening file $terminal_counter  $!\n";
    while (<COUNT_FILE>) {
        chop($_);
        ($currentnumber, @other_counter_fields) = split(/\|/, $_);
    };    # End of While
    close(COUNT_FILE);
##### end of Read Counter

    print <<HTML;



     <P>
      <TABLE BORDER=0 CELLSPACING=0>


     <TR>
       <TD> </TD>
       <TD>
       <div id="companySuggest" class="suggest">
        <input id="company" size="60" type="hidden" name="company" value="$company_id" onKeyUp="doSearchCompanyId(this.value);" autocomplete="off" />
        <div id="companySuggestItems"></div>
        </div>
       </TD>
    </TR>

    <TR>
         <TD></TD>
         <TD>
      <input id="CompanyID" size="6" type="hidden" name="TERMINAL_CompanyID" value="$company_id" readonly  autocomplete="off" />
    
   </TR>

        <TR>
         <TD> </TD>
         <TD><INPUT type="hidden" NAME="TERMINAL_TID" value="$currentnumber"  readonly onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
         <TD></TD>
         <TD><INPUT type="hidden"  NAME="TERMINAL_PriceListingFile" value="I$currentnumber.csv" readonly   onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
         <TD></TD>
         <TD><INPUT type="hidden"  NAME="TERMINAL_BasicParamFile" value="B$currentnumber.csv" readonly    onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>
         <TD> </TD>
         <TD><INPUT type="hidden"  NAME="TERMINAL_UsersFile" value="U$currentnumber.csv" readonly onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
       <TR>
        <TR>
         <TD> </TD>
         <TD><INPUT  type="hidden"  NAME="TERMINAL_SerialNumber" value="" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
         <TD></TD>
         <TD><INPUT  type="hidden"  NAME="TERMINAL_Model" value="" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
         <TD></TD>
         <TD><INPUT  type="hidden"  NAME="TERMINAL_InternetConnection" value="" onkeydown="return tabOnEnter (this, event);"  > </TD>
         </TR>

        <TR>
         <TD><B>Unesite broj naplatnog uređaja:</B></TD>
         <TD><INPUT TYPE=TEXT NAME="TERMINAL_TIID"   onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>
         <TD></TD>
         <TD><INPUT type="hidden" NAME="TERMINAL_MasterKey"   onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>

        <TR>
         <TD><B>Odaberite prodajno mjesto:</B></TD>
<TD>
<div id="shopSuggest" class="suggest">
        <input id="shop" size="90" type="text" name="shop" autocomplete="off" 
                       onkeydown="doSearch(document.getElementById('CompanyID').value);"
                       onChange="doSearch(document.getElementById('CompanyID').value);"
                       onClick="doSearch(document.getElementById('CompanyID').value);" />
        <div id="shopSuggestItems"></div>
</div>
</TD>
         </TR>



        <TR>
         <TD><B>Oznaka prodajnog mjesta:</B></TD>
<TD>
 <input id="TERMINAL_ShopID" size="20" type="text"  name="TERMINAL_ShopID" readonly  autocomplete="off" />
</TD>
         </TR>

         <TD></TD>
         <TD>
<INPUT type="hidden" NAME="TERMINAL_PaymentModalities" value="GKCTO" id="TERMINAL_PaymentModalities" readonly  onkeydown="return tabOnEnter (this, event);"  >

</TD>
         </TR>
        
         
       <TR>
        <TD COLSPAN=2>
         <CENTER><BR>

<INPUT TYPE=button  onClick="validate('confirm_card');"  VALUE="Spremi" >

         </CENTER>
        </TD>
       </TR>
      </TABLE>
     <P>
    </FONT>
<SCRIPT LANGUAGE="JavaScript" >






 function validate(action) {

    var  success = true;

    var terminalNumberTIID = document.myForm.TERMINAL_TIID.value;
    terminalNumberTIID = terminalNumberTIID.replace(/[\\D]/g, '' );
    document.myForm.TERMINAL_TIID.value = terminalNumberTIID;

    if( terminalNumberTIID >999 ||  terminalNumberTIID <1 )  {
      alert( "Unesite broj naplatnog uređaja i odaberite prodajno mjesto. Broj mora biti manji manji od 1000." );
      document.myForm.TERMINAL_TIID.focus();
      success = false;
    };


    var terminalShopID = document.myForm.TERMINAL_ShopID.value;
    if( terminalShopID == 0)  {
      alert( "Odaberite neko prodajno mjesto." );
      document.myForm.TERMINAL_ShopID.focus();
      success = false;
    };

    if (success)  {
      myForm.action.value=action;
      document.myForm.submit();
    }

 }



function getElementIndex(obj) {
    var theform = obj.form;
    for (var i=0; i<theform.elements.length; i++) {
        if (obj.name == theform.elements[i].name) {
            return i;
            }
        }
    return -1;
    }


function tabNext(obj) {
    if (navigator.cgiatform.toUpperCase().indexOf("SUNOS") != -1) {
        obj.blur(); return; // Sun's onFocus() is messed up
        }
    var theform = obj.form;
    var i = getElementIndex(obj);
    var j=i+1;
    if (j >= theform.elements.length) { j=0; }
    if (i == -1) { return; }
    while (j != i) {
        if ((theform.elements[j].type!="hidden") && 
            (theform.elements[j].name != theform.elements[i].name) && 
            (!theform.elements[j].disabled)) {
            theform.elements[j].focus();
            break;
            }
        j++;
        if (j >= theform.elements.length) { j=0; }
        }
    }
</SCRIPT>
<br><br><br><br><br><br><br>
HTML

    $DefaultPriceListing = "$root/mercur_data/DefaultPricelist.csv";
    $PriceListing        = "$root/mercur_data/I" . $currentnumber . ".csv";
    copy($DefaultPriceListing, $PriceListing);

    # put I Marker file
    $TID_marker_I = "$root/mercur_markers/I_MARKER" . $currentnumber;
    open(TID_MARKER, ">$TID_marker_I")
      || die "Error opening user file. $TID_marker_I  $!\n";
    close(TID_MARKER);

    &html_footer;
}    # End of print_add_screen subroutine.




 




sub copy {

    # copy("/folder1/abc.dat", "/folder2/abc.dat") or die("cannot copy\b");
    my ($from, $to) = @_;
    if (open(IN, $from)) {
        if (open(OUT, ">$to")) {
            binmode(OUT);
            while (read IN, $buf, 4096) {
                print OUT $buf;
            }    # read FILEHANDLE, SCALAR, LENGTH
            close IN;
            close OUT;
            return 1;
        }
        close IN;
    }
    return 0;
}







############# Results Screen ################
sub terminal_listing {
    html_header($search_oib, $company_id);

    if (($search_oib ne "") && ($company_id ne "")) {

        $rows_left_to_view = $total_row_count - $new_hits_seen;
        $start_hit         = $hits_seen + 1;
        $end_hit           = $new_hits_seen;
        $hits_displayed    = $end_hit - $start_hit + 1;
        if ($total_row_count > 1) {
            print qq~<P>Pronađeno: <B>$total_row_count</B> uređaja <BR>~;
            if ($total_row_count > $max_rows_returned) {
                if ($hits_displayed == 2) {
                    print qq~<B>Last two</B> records shown below<BR>~;
                }
                elsif ($hits_displayed == 1) {
                    print qq~<B>Last</B> record shown below<BR>~;
                }
                else {
                    print
                      qq~<B>$start_hit</B> - <B>$end_hit</B> shown below<BR>~;
                }
            }    #end if
        }    #end if ... > 1
        else {print qq~<P>Pronađen: jedan uređaj\n~;}

        $cerca = $search_for;
        print qq~

<script type="text/javascript">


document.onkeydown = function (e) {
  if (e.keyCode === 116) {
    return false;
  }
};


function Fina_registration(record_key) {
   document.myForm.key.value=record_key;
   document.myForm.search_field.value='all';
   document.myForm.action.value='Fina_registration';
   document.myForm.submit();
}



function ValueTransfer(f) {
	self.opener.document.myForm.TERMINAL_PriceListingFile.value = f;
	}


var myWind = ""

function priceListing_x(terminal) {
// either open, or put on the top if it is already existing
	if (myWind == "" || myWind.closed || myWind.name == undefined) {
 
           var upload_url = "$main_path/fileupload/uploadpricelist.aspx?tid=" + terminal;
           pics = window.open(upload_url,"subWindow","HEIGHT=200,WIDTH=620,status=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes").focus();

	} else{	myWind.focus();	}
}




function editPrices(tid){
// <input onclick="myForm.tid.value='';myForm.action.value='EditPrices';this.form.submit();" value="Edit PRICE LIST" type="button">
// either open, or put on the top if it is already existing
	if (myWind == "" || myWind.closed || myWind.name == undefined) {
 
           var url ="$main_path/cgi-bin/mercur_terminals.cgi?action=EditPrices&tid=" + tid;
           pics = window.open(url,"subWindow","HEIGHT=600,WIDTH=800,status=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes").focus();

	} else{	myWind.focus();	}
}


function new_terminal(company_id){
   document.myForm.search_field.value='all';
   document.myForm.action.value='new_card';
   document.myForm.submit();
}


function last_activities(company_id){
   document.myForm.search_field.value='all';
   document.myForm.action.value='last_activities';
   document.myForm.submit();
}



function popWindowArticles(url, pdf){
	var width;
	var height;
	var name;
	if (!pdf) pdf = false;
	if (pdf){
		width = 700;
		height = 500;
		name = "pdfPopWindow";
	}else{
		width = 700;
		height = 500;
		name = "OffSitePopWindow";
	}	
 	var realW = (width)/2;
	var realH = (height)/2;
 	if (document.all){		
        var xMax = screen.width, yMax = screen.height;
    }else if (document.layers){       
        var xMax = screen.width, yMax = screen.height;
    }else if (document.getElementById){
		var xMax = screen.width, yMax = screen.height;
	}else{
		var xMax = 800, yMax=600;
	}
	var xOffset = ((xMax)/2) - realW, yOffset = (((yMax)/2)) - realH; 
	if (yMax==600){
		yOffset = 0;
	}	
	
	if (pdf) {
		var options = "directories=no,status=no,location=no,scrollbars=no,menubar=no,toolbar=no,resizable=yes" + ",screenX=" + xOffset + ",screenY=" + yOffset + ",top=" + yOffset + ",left=" + xOffset + ",width=" + width + ",height=" + height;
	}else{
		var options = "directories=yes,status=yes,location=yes,scrollbars=yes,menubar=yes,toolbar=yes,resizable=yes" + ",screenX=" + xOffset + ",screenY=" + yOffset + ",top=" + yOffset + ",left=" + xOffset + ",width=" + width + ",height=" + height;
	}
	
	popup = window.open(url,name,options);
	popup.focus();	
}
</script>

 <br>          
      <INPUT TYPE=button  onClick=\"new_terminal($company_id);\"  VALUE=\"Novi uređaj\" >    
      <INPUT TYPE=button  onClick=\"last_activities($company_id);\"  VALUE=\"Posljednje aktivnosti na uređajima\" >      
<br>
~;

        $which_search = $choose;

        &next_page_buttons($rows_left_to_view);

        print "<INPUT TYPE=\"hidden\" NAME=\"key\" VALUE='0'>\n";

        print <<HTML;
<br><br><br><br>
<div class="tekst1" style="margin-left:20px; margin-top:-15px">
<input name="TERMINAL_PriceListingFile" value="" readonly type="hidden">

<table border="0" cellpadding="4" width="98%"  bgcolor="#E4E4FF" > 
<tr> 
  <td > &nbsp;&nbsp;&nbsp;</td> 
  <td  width="20%"><strong>Broj naplatnog uređaja </strong></td> 
  <td width="30%"><strong>Oznaka prodajnog mjesta </strong></td> 
  <td width="45%"> </td> 
</tr> 

HTML

        foreach my $row (@results) {
            my $record = $row->{row};
            ($key, $dbuser, $when_added, @field_vals) = split(/\|/, $record);

            #assign all record variables
            $x = 0;
            foreach $field (@fields) {
                ${$field} = $field_vals[$x];
                $x++;
            }

            $PriceListing = "../mercur_data/" . "I$TERMINAL_TID.csv";
            $Prices =
qq~ <a  href="javascript:popWindowArticles('$PriceListing');">cjenik: <b>$TERMINAL_PriceListingFile &nbsp;&nbsp;</b></a> &nbsp;&nbsp;~;

            $control_buttons = qq~
           <input onclick="priceListing_x($TERMINAL_TID)" value="Učitaj cjenik" name="storage" type="button">
           <input onclick="editPrices($TERMINAL_TID)" value="Uredi cjenik" name="storage" type="button"> 
           <INPUT TYPE=button  onClick=\"myForm.tid.value='$TERMINAL_TID';myForm.action.value='GenerateParamFiles';this.form.submit();\"  
                  VALUE=\"Ažuriranje uređaja\" >   

           $Prices
   ~;

#        <INPUT TYPE=button  onClick=\"myForm.key.value='$key';myForm.search_field.value='all'; myForm.action.value='Delete Record';this.form.submit();\"  VALUE=\"Eliminate card\" >
#          <INPUT TYPE=button  onClick=\"myForm.key.value='$key';myForm.search_field.value='all'; myForm.action.value='Edit_opera';this.form.submit();\"  VALUE=\"Učitaj cjenik i uredi podatke\" >

            #  FETCH  $MIID_descriptor
            $MIID_descriptor = "<b>ERROR: missing MIID</b>";

            if ($TERMINAL_TID ne "") {

                my $tid_complex = $row->{term};

                if ($tid_complex =~ /error/i) {
                    print "$tid_complex<br>";

    #error= Pos terminal is not active  |120|Pos terminal nije u aktivnom stanju
    #error= Pos terminal not registered |140| Pos terminal nije registriran
                }
                else {
                    ($error_message, $MIID_descriptor) = split(
                        /\~/, $tid_complex
                      );
                }
            }

            if ($MIID_descriptor eq "") {
                $MIID_descriptor = "neažurirani uređaj";
            }

            print <<HTML;
   <tr>
      <td > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td> 
      <td > <b>$TERMINAL_TIID </b> ($TERMINAL_TID)</td> 
      <td >$MIID_descriptor </td> 
      <td >$control_buttons</td> 
   </tr> 
HTML

        }    # End of foreach record loop.

    }

    print "</TABLE></div>";

    $which_search = $choose;

    &next_page_buttons($rows_left_to_view);

    print "<INPUT TYPE=\"hidden\" NAME=\"sort_on\" VALUE=\"$sort\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"display\" VALUE=\"$display\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"search_for\" VALUE=\"$search_for\">\n";
    print
      "<INPUT TYPE=\"hidden\" NAME=\"search_field\" VALUE=\"$search_field\">\n";

    print "<p>";

    &html_footer;
}    # End of terminal_listing subroutine.

################# FetchSHOP_record ######################
sub FetchSHOP_record {
    my $search_for    = $_[0];    # $TERMINAL_ShopID
    my $target_record = "";
    my @results       = ();
    my $cardId;

    $search_for =~ s/\s//g;
    print ".. ShopID: $search_for ";

    my $database =
      "$root/mercur/mercur_shops.txt";    # Data file terminals name and path

    open(DB, "$database") or die "Error opening database. $database $!\n";
    while (<DB>) {
        (
            $key,                       $dbuser,
            $when_added,                $SHOP_ID,
            $SHOP_CompanyID,            $SHOP_MIID,
            $SHOP_name,                 $SHOP_Adresa_Ulica,
            $SHOP_Adresa_KucniBroj,     $SHOP_Adresa_KucniBrojDodatak,
            $SHOP_Adresa_BrojPoste,     $SHOP_Adresa_Naselje,
            $SHOP_Adresa_Opcina,        $SHOP_RadnoVrijeme,
            $SHOP_DatumPocetkaPrimjene, $SHOP_ZatvorenoOtvoreno,
            $SHOP_SpecNamj,             $SHOP_OstaliTipoviPoslProstora
        ) = split(/\|/, $_);

        if ($SHOP_ID == $search_for) {
            push @results, $_;
            print
"<br>uređaj se nalazi na prodajnom mjestu: <b>$SHOP_MIID</b> .. $SHOP_Adresa_Ulica $SHOP_Adresa_KucniBroj ($search_for)<br>";
        }

    }    # End of while.
    close(DB);

    my $count = @results;
    if ($count < 1) {
        $target_record = "";
        $err_message   = "Error=110 Neregistrirana trgovina $search_for";
    }

    if ($count > 1) {
        $target_record = "";
        $err_message =
          "Error=111 Too many results found for SHOPId $search_for";
    }

    if ($count == 1) {
        $target_record = @results[0];
        $err_message   = "";
    }

    chomp $target_record;
    $return_string = "$err_message|$target_record";

    # print "FetchSHOP_record: $return_string ...";
    return $return_string;
}
########### end of FetchSHOP_record #############

sub terminal_activity_status {

    # terminal je suspendiran ako je u B fajlu status "inactive" ili "disabled".
    my $company_status  = $_[0];
    my $terminal_status = $_[1];

    my $activity_status = $company_status;
    if ($terminal_status eq "neaktivan") {$activity_status = "disabled";}

    return $activity_status;

}

# used by sort() for sorting in search_db()
sub by_miid {
    my $f = $a->{term};
    my $s = $b->{term};
    my ($shop1) = $f =~ /\~([^\.]+)\./;
    my ($shop2) = $s =~ /\~([^\.]+)\./;
    return $shop1 cmp $shop2;
}






















############# last_activities Listing ################
sub last_activities_listing {
    html_header($search_oib, $company_id);

    if (($search_oib ne "") && ($company_id ne "")) {

        $rows_left_to_view = $total_row_count - $new_hits_seen;
        $start_hit         = $hits_seen + 1;
        $end_hit           = $new_hits_seen;
        $hits_displayed    = $end_hit - $start_hit + 1;
        if ($total_row_count > 1) {
            print qq~<P>OIB: $search_oib, CID: $company_id Pronađeno: <B>$total_row_count</B> uređaja <BR>~;
            if ($total_row_count > $max_rows_returned) {
                if ($hits_displayed == 2) {
                    print qq~<B>Last two</B> records shown below<BR>~;
                }
                elsif ($hits_displayed == 1) {
                    print qq~<B>Last</B> record shown below<BR>~;
                }
                else {
                    print
                      qq~<B>$start_hit</B> - <B>$end_hit</B> shown below<BR>~;
                }
            }    #end if
        }    #end if ... > 1
        else {print qq~<P>Pronađen: jedan uređaj\n~;}

        $cerca = $search_for;
        print qq~

<script type="text/javascript">


document.onkeydown = function (e) {
  if (e.keyCode === 116) {
    return false;
  }
};


function Fina_registration(record_key) {
   document.myForm.key.value=record_key;
   document.myForm.search_field.value='all';
   document.myForm.action.value='Fina_registration';
   document.myForm.submit();
}



function ValueTransfer(f) {
	self.opener.document.myForm.TERMINAL_PriceListingFile.value = f;
	}


var myWind = ""

function priceListing_x(terminal) {
// either open, or put on the top if it is already existing
	if (myWind == "" || myWind.closed || myWind.name == undefined) {
 
           var upload_url = "$main_path/fileupload/uploadpricelist.aspx?tid=" + terminal;
           pics = window.open(upload_url,"subWindow","HEIGHT=200,WIDTH=620,status=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes").focus();

	} else{	myWind.focus();	}
}




function editPrices(tid){
// <input onclick="myForm.tid.value='';myForm.action.value='EditPrices';this.form.submit();" value="Edit PRICE LIST" type="button">
// either open, or put on the top if it is already existing
	if (myWind == "" || myWind.closed || myWind.name == undefined) {
 
           var url ="$main_path/cgi-bin/mercur_terminals.cgi?action=EditPrices&tid=" + tid;
           pics = window.open(url,"subWindow","HEIGHT=600,WIDTH=800,status=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes").focus();

	} else{	myWind.focus();	}
}




function default_menu(company_id){
   document.myForm.search_field.value='all';
   document.myForm.action.value='main';
   document.myForm.submit();
}




function popWindowArticles(url, pdf){
	var width;
	var height;
	var name;
	if (!pdf) pdf = false;
	if (pdf){
		width = 700;
		height = 500;
		name = "pdfPopWindow";
	}else{
		width = 700;
		height = 500;
		name = "OffSitePopWindow";
	}	
 	var realW = (width)/2;
	var realH = (height)/2;
 	if (document.all){		
        var xMax = screen.width, yMax = screen.height;
    }else if (document.layers){       
        var xMax = screen.width, yMax = screen.height;
    }else if (document.getElementById){
		var xMax = screen.width, yMax = screen.height;
	}else{
		var xMax = 800, yMax=600;
	}
	var xOffset = ((xMax)/2) - realW, yOffset = (((yMax)/2)) - realH; 
	if (yMax==600){
		yOffset = 0;
	}	
	
	if (pdf) {
		var options = "directories=no,status=no,location=no,scrollbars=no,menubar=no,toolbar=no,resizable=yes" + ",screenX=" + xOffset + ",screenY=" + yOffset + ",top=" + yOffset + ",left=" + xOffset + ",width=" + width + ",height=" + height;
	}else{
		var options = "directories=yes,status=yes,location=yes,scrollbars=yes,menubar=yes,toolbar=yes,resizable=yes" + ",screenX=" + xOffset + ",screenY=" + yOffset + ",top=" + yOffset + ",left=" + xOffset + ",width=" + width + ",height=" + height;
	}
	
	popup = window.open(url,name,options);
	popup.focus();	
}
</script>

 <br>            
      <INPUT TYPE=button  onClick=\"default_menu($company_id);\"  VALUE=\"Uređaji - glavni izbornik\" >      
<br>
~;

        $which_search = $choose;

        &next_page_buttons($rows_left_to_view);

        print "<INPUT TYPE=\"hidden\" NAME=\"key\" VALUE='0'>\n";

        print <<HTML;
<br><br><br><br>
<div class="tekst1" style="margin-left:20px; margin-top:-15px">
<input name="TERMINAL_PriceListingFile" value="" readonly type="hidden">

<table border="0" cellpadding="4" width="98%"  bgcolor="#E4E4FF" > 
<tr> 
  <td > &nbsp;&nbsp;&nbsp;</td> 
  <td width="15%"><strong>Broj uređaja (tid) </strong></td> 
  <td width="30%"><strong>Oznaka prodajnog mjesta </strong></td> 
  <td width="20%">Posljednje zatvaranje dana</td> 
  <td width="30%">Posljednji potpisani račun</td> 

</tr> 
HTML


    # Create %last_activity_hash
    my $terminal_activity   = $root ."mercur/mercur_terminals_info.txt";

    my %last_activity_hash = ();
    my @tid_line           = ();
    open(FH, "$terminal_activity ") || die "Error opening file. $! $terminal_activity  \n";
    @tid_line = <FH>;
    close(FH);

    foreach $tid_record (@tid_line) {
        chomp $tid_record;
        ($key, $dbuser, $when_added, $tid, @altro) = split(/\|/, $tid_record);
        $last_activity_hash{$tid} = $tid_record;
    }
    # end of %last_activity_hash creation



        foreach my $row (@results) {
            my $record = $row->{row};
            ($key, $dbuser, $when_added, @field_vals) = split(/\|/, $record);

            #assign all record variables
            $x = 0;
            foreach $field (@fields) {
                ${$field} = $field_vals[$x];
                $x++;
            }


            #  FETCH  $MIID_descriptor
            $MIID_descriptor = "<b>ERROR: missing MIID</b>";

            if ($TERMINAL_TID ne "") {

                my $tid_complex = $row->{term};

                if ($tid_complex =~ /error/i) {
                    print "$tid_complex<br>";
 
                }
                else {
                    ($error_message, $MIID_descriptor) = split(
                        /\~/, $tid_complex
                      );
                }

                $last_activity_record =$last_activity_hash{$TERMINAL_TID}; 
                ($k, $dbu, $when, $tid, $last_ftp_transmission, 
                	 $last_fina_signing, $last_bill_number, $ingenico_application) =split(/\|/, $last_activity_record);
            }

            if ($MIID_descriptor eq "") {
                $MIID_descriptor = "neažurirani uređaj";
            }

            print <<HTML;
   <tr>
      <td > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td> 
      <td > <b>$TERMINAL_TIID </b> ($TERMINAL_TID)</td> 
      <td > $MIID_descriptor </td> 
      <td > $last_ftp_transmission </td> 
      <td > $last_fina_signing </td> 
 
   </tr> 
HTML

        }    # End of foreach record loop.

    }

    print "</TABLE></div>";

    $which_search = $choose;

    &next_page_buttons($rows_left_to_view);

    print "<INPUT TYPE=\"hidden\" NAME=\"sort_on\" VALUE=\"$sort\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"display\" VALUE=\"$display\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"search_for\" VALUE=\"$search_for\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"search_field\" VALUE=\"$search_field\">\n";

    print "<p>";

    &html_footer;
}    # End of last_activities subroutine.




################# Add Record ##################

sub add_record {
    my $record;
    $when_added = &get_date;
    $unix_time  = time();
    $key        = $unix_time . $user . $company_id;
    $record     = $key;
    $record .= "\|$user";
    $record .= "\|$when_added";
    foreach $field (@fields) {
        ${$field} = $q->param($field);
        ${$field} = filter(${$field});
        $record .= "\|${$field}";
    }

   open (my $db_fh, ">>", $database) || die "Error opening database. $database $!\n"; 
   flock($db_fh, LOCK_EX) or die "Could not lock $database - $!";
   seek $db_fh, 0, 2;
   print $db_fh "$record\n";
   close($db_fh);

   open (my $fh_b, ">>", $db_bis) || die "Error opening database. $db_bis $!\n"; 
   flock($fh_b, LOCK_EX) or die "Could not lock $database - $!";
   seek $fh_b, 0, 2;
   print $fh_b "$record\n";
   close($fh_b);


}    # End of add_record subroutine.












################# Modify Record ##################

sub modify_record {
 foreach $required (@required){
 if($q->param($required) eq "") { 
 $title = "Add A Record"; $error_message = "You did not fill out the required information!"; &access_problem($error_message); exit; } }
 $when_added = &get_date;
# Eliminando_la_Scheda_precedente or conservendo_la_Scheda_precedente -- may be or not conserved the modification history
 if ($update_mode eq "conserve") {  $key = time()   }; 
 $key =~ s/\D//g;
 $record=$key . "_". $company_id;
 $record .= "\|$user";
 $record .= "\|$when_added";
 foreach $field (@fields){ ${$field} = $q->param($field); ${$field} = &filter(${$field}); $record .= "\|${$field}"; }

   open (my $db_fh, ">>", $database) || die "Error opening database. $database $!\n"; 
   flock($db_fh, LOCK_EX) or die "Could not lock $database - $!";
   seek $db_fh, 0, 2;
   $record =~ s/[\n\r]//g;
   print $db_fh "$record\n";
   close($db_fh);
} # End of modify_record subroutine.







############## Delete Records #################

sub delete_records   {
my @new_data;
my $deleted_record;
  open (my $db_fh, "<", $database) || die "Error opening database. $database $!\n"; 
  flock($db_fh, LOCK_EX) or die "Could not lock $database - $!";         
  while (<$db_fh>)   {
    $line = $_;
    chomp $line;
    @dbfields = split (/\|/, $line);
    $deleted = "no";
    if ($dbfields[0] eq $q->param(key)) { 
      $deleted = "yes"; if ($user eq $dbfields[1]) { $security_satisfied = "yes"; } 
      $deleted_record =$line;
    }
    elsif ($deleted ne "yes") { 
      push @new_data, $line;
    };
    } #end of while
  close ($db_fh);
  if ($authenticate ne "yes") { $security_satisfied = "yes"; }
  if ($security_satisfied ne "yes" && $record_ownership eq "yes" && $admin_user_name ne "$user")   {
    $error_message = "You are not autorised to access this data!";
    &access_problem($error_message);
    exit;
    }  
  else  {

   open (my $db_fh, ">", $database)  || die "Error opening database. $database $!\n";
   flock($db_fh, LOCK_EX) or die "Could not lock $database - $!";
   foreach $record_line (@new_data){ 
       print $db_fh "$record_line\n";
   };
   close($db_fh);
 
   open (my $fh_b, ">", $db_bis) || die "Error opening database. $db_bis $!\n";
   flock($fh_b, LOCK_EX) or die "Could not lock $db_bis  - $!"; 
   foreach $record (@new_data){ 
       print $fh_b "$record\n"; 
   };
   close($fh_b);

   open(my $fh_a, ">>", $delete_history) or die "Could not open $! $delete_history  \n";
   flock($fh_a, LOCK_EX) or die "Could not lock $delete_history - $!";
   $when_deleted = &get_date;
   $id_suffix = "$user|$company_id|$shop_id|$when_deleted|$ENV{'REMOTE_ADDR'}\|$ENV{'HTTP_USER_AGENT'}";
   print $fh_a "$deleted_record|$id_suffix\n"; 
   close ($fh_a);

    }
  } 




