#!/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;

my $main_path;
my $root;



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 = undef;

# enable on TEST server
$MIID_SORT_OK = 1 if $ENV{SERVER_NAME} =~ /test/;

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

$database  = "$root/mercur/mercur_salesmen.txt";    # Data file terminals name and path
$user_file = "$root/mercur/mercur_users.txt";       # User file name and path

$snowtrack = "$root/mercur_backup/snowtrack.txt";
$db_bis    = "$root/mercur/bis_salesmen.txt";       # Data file bis
$delete_history = "$root/mercur/mfb_deleted_salesmen.txt";

###############################################
###                  Set Configurations Below
###############################################
### Specify database OPERE fields in the array below
@fields = (
    "SALESMAN_CompanyID",  "SALESMAN_ShopID",
    "SALESMAN_TerminalID", "SALESMAN_Ime",
    "SALESMAN_Oib",        "SALESMAN_Password",
    "SALESMAN_MagstripeRFU"
);

# 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");

# 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);
$Supply          = $q->param(Supply);
$search_field    = $q->param(search_field);
$action          = $q->param(action);
$display         = $q->param(display);
@keys            = $q->param(key);
$key             = $q->param(key);
$email           = $q->param(email);

$search_for  = $q->param(search_for);
$search_oib  = $q->param(company_oib);
$company_oib = $q->param(company_oib);
$company_id  = $q->param(company_id);
$terminal_id = $q->param(terminal_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

## 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") {

    # 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) {&print_add_screen;}
    elsif ($action =~ /confirm_card/i) {
        &add_record;
        UpdateTerminalFiles_page($terminal_id);
    }
    elsif ($action =~ /Edit_opera/i) {
        $title         = "Edition Error";
        $error_message = "You forgot to select a record to modify!";
        &access_problem if ($key < 1);
        &search_db($key);
        &print_modify_page;
    }

    elsif ($action =~ /ModifyThisRecord/i) {
        $title = "Modify";
        &delete_records;
        $key = $keys[0];
        &modify_record;
        UpdateTerminalFiles_page($terminal_id);
    }

    elsif ($action =~ /delete record/i) {
        $title         = "Delete Record";
        $error_message = "You forgot to select a record to delete!";
        &access_problem if ($key < 1);
        &delete_records;
        $message = "Record Updated";
        $title   = "Main Menu";
        &search_cid($company_id);
        &salesmen_listing;
    }

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

    elsif ($action =~ /user manager/i) {$title = "User Manager"; &user_manager;}
    elsif ($action =~ /create new user/i) {
        $title       = "User Manager - Create New User";
        $perform     = "add";
        $button_text = "Add User";
        &edit_user;
    }
    elsif ($action =~ /edit selected user/i) {
        $title       = "User Manager - Edit Selected User";
        $perform     = "edit";
        $button_text = "Edit User";
        &edit_user;
    }
    elsif ($action =~ /edit user/i) {
        $old_password = $q->param(old_password);
        &delete_user;
        $perform = "edit";
        &add_user;
    }
    elsif ($action =~ /remove selected user/i) {
        $perform = "delete";
        &delete_user;
        $title = "User Manager";
        &user_manager;
    }

    # $title="Main Menu"; &print_default($title);
    else {
        &search_cid($company_id);
        $title  = "Search Results";
        $choose = "search";
        $what   = "search";
        &salesmen_listing;
    }
}

exit;


################### 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;
}

################# 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
        }
    }

}
 

############### 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 ################

############### 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

################# 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, $_}

    }    # 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 #############

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

sub ParametricFiles_screen {
    my $TID = $_[0];
    $title = "Generate Parametric Files";
    &html_header($title);
    print
"Podaci za terminal $TID su pripremljeni. Na terminalu provedite postupak sinkronizacije. <br>\n";
    &GenerateParametricFiles($TID);
    &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";

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

    &html_header_mini($title);
    print <<HTML;

<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 validate(action) {
    var  success = true;
    var str = document.myForm.SALESMAN_Oib.value;
    document.myForm.SALESMAN_Oib.value = str.replace(" ", "", "gi");

        // cleanup the form, trim initial and terminal spaces in the form
        var form = document.forms["myForm"];

	for (var i=0; i<form.elements.length; i++) {
          x = form.elements[i].value;
          x = x.replace(/[^čćžšđČĆŽŠĐ\\-\\s\\:\\w\\/\\.\\,]/g, '' );
          x = x.replace(/\\_/g, '' );
          x = x.replace(/\\./g, '' );
          x = x.replace(/\\s+\$/, '' );
          x = x.replace(/^\\s+/, '' );

          form.elements[i].value =x;
	} 
     
 

    if( str == "" ||  isNaN( str ) || str.length != 11 )  {
        alert( "Molimo Vas, unesite ispravan OIB blagajnika, 11 znamenki." );
        document.myForm.SALESMAN_Oib.focus() ;
        success = false;
    } 

 
    var lozinka   = document.myForm.SALESMAN_Password.value;
    var regex1    =/\\W/;   //  only regular chaaracters 
    var lozinka_test1  = regex1.test(lozinka);
 
    if( lozinka.length <3 || lozinka.length >9 ||  lozinka_test1   )  {
      alert( "Unesite lozinku blagajnika, samo engleska slova i znamenke. Lozinka mora imati manje od 9  i najmanje 3 znaka." );
 
      document.myForm.SALESMAN_Password.focus() ;
      success = false;
    };
     

 
     

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

 }

//  End -->
</script>
 

   <INPUT TYPE=HIDDEN NAME="terminal_id" value="$SALESMAN_TerminalID"   >
   <INPUT TYPE=HIDDEN NAME=key value="$key">
      <TABLE BORDER=0 CELLSPACING=0>


        <TR>
         <TD></TD>
         <TD>
         <TD><INPUT TYPE="hidden" NAME="SALESMAN_CompanyID" value="$SALESMAN_CompanyID" id="SALESMAN_CompanyID" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

	
        <TR>
         <TD><B>Jedinstveni identifikator trgovine :</B></TD>
         <TD><INPUT TYPE=TEXT NAME="SALESMAN_ShopID" value="$SALESMAN_ShopID" readonly id="SALESMAN_ShopID" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>
         <TD><B>Jedinstveni identifikator terminala:</B></TD>
         <TD><INPUT TYPE=TEXT NAME="SALESMAN_TerminalID" id="SALESMAN_TerminalID" readonly value="$SALESMAN_TerminalID" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>


        <TR>
         <TD><B>Ime i prezime trgovca:</B></TD>
         <TD><INPUT TYPE=TEXT NAME="SALESMAN_Ime" value="$SALESMAN_Ime"  onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>
         <TD><B>OIB trgovca:</B></TD>
         <TD><INPUT TYPE=TEXT NAME="SALESMAN_Oib" value="$SALESMAN_Oib"  onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>
         <TD><B>Lozinka trgovca:</B></TD>
         <TD><INPUT TYPE="password" NAME="SALESMAN_Password" value="$SALESMAN_Password"   onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>
         <TD></TD>
         <TD><INPUT TYPE="hidden" NAME="SALESMAN_MagstripeRFU"   onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
       <TR>
        <TD COLSPAN=2>
         <CENTER><BR>
 
<INPUT TYPE=button  onClick="myForm.key.value='$key';myForm.tid.value='$TERMINAL_TID';validate('ModifyThisRecord');"  VALUE="Spremi" >
         </CENTER>
        </TD>
       </TR>
      </TABLE>
	<BR>

   <P>
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 {

    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/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>
 
</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, MMXIV, 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.Etranet.hr/" target="_blank" title ="Etranet">Etranet</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 " . \n";
        @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 = " - \n";
    }

    if ($activity == 0) {
        $err_message = " .";
    }

    return "$err_message~$miid_descriptor~$TERMINAL_TIID ($TERMINAL_Status)";

}

# End of Search Terminals BASIC Terminal File subroutine.

############# BU FILES Screen ################
sub batch_update_listing {

    $cerca = $search_for;

    $which_search = $choose;

    my (
        $SALESMAN_CompanyID,    $SALESMAN_ShopID, $SALESMAN_TerminalID,
        $SALESMAN_Ime,          $SALESMAN_Oib,    $SALESMAN_Password,
        $SALESMAN_MagstripeRFU, $SALESMAN_MIID,   $SALESMAN_TIID
    );

    &html_header($title);

    print <<HTML;
<br><br><br><br>
<div class="tekst1" style="margin-left:20px; margin-top:-20px">
<
HTML

    foreach $record (@results) {
        (
            $k,                 $dbuser,
            $when_added,        $SALESMAN_CompanyID,
            $SALESMAN_ShopID,   $SALESMAN_TerminalID,
            $SALESMAN_Ime,      $SALESMAN_Oib,
            $SALESMAN_Password, $SALESMAN_MagstripeRFU,
            $SALESMAN_MIID,     $SALESMAN_TIID
        ) = split(/\|/, $record);

        print "Podaci za terminal <b>$SALESMAN_TerminalID  </b> su pripremljeni. Na terminalu provedite postupak sinkronizacije. <br>\n";
        &GenerateParametricFiles($SALESMAN_TerminalID);

    }    # End of foreach record loop.

    print qq~
</div>
<br>
~;

    $which_search = $choose;

    print "<p>";
    $cerca_t = $cerca;
    if ($cerca eq '.') {$cerca_t = 'tutto'}
    &html_footer;
}    # End of BU_listing subroutine.

################# 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 #############

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

    my (
        $SALESMAN_CompanyID,    $SALESMAN_ShopID, $SALESMAN_TerminalID,
        $SALESMAN_Ime,          $SALESMAN_Oib,    $SALESMAN_Password,
        $SALESMAN_MagstripeRFU, $SALESMAN_MIID,   $SALESMAN_TIID
    );

    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> prodavača<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 prodavač\n~;}

        $cerca = $search_for;
        print qq~

        <script type="text/javascript">

        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 DeleteDilemma(kljuc) {
        if (confirm('UPOZORENJE: Ako kliknete OK, prodavač će biti izbrisan. Još uvijek želite nastaviti?')){
        myForm.key.value=kljuc;
        myForm.search_field.value='all';
        myForm.action.value='Delete Record';
        myForm.submit();           
        }
        else {
        myForm.action.value='';
        }
        }

        </script>
        ~;

        $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:-20px">
<table bgcolor="#E4E4FF" border="0" cellpadding="7" cellspacing="5" width="70%">
  <tbody><tr>
     <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td> 

    <td valign="top" width="133">
     <b> Ime prodavača </td>
    <td valign="top" width="116"><b>OIB</b></td>
    <td valign="top" width="180"><b>Prodajno mjesto</b></td>
    <td valign="top" width="140"><b>Terminal</b></td>
    <td valign="top" width="118"><b>&nbsp;</b></td>

  </tr>
HTML

        #use Data::Dumper;
        #print '<pre>'.Dumper(\@results).'</pre>';

        foreach my $row (@results) {
            my $record = $row->{res};
            (
                $k,                 $dbuser,
                $when_added,        $SALESMAN_CompanyID,
                $SALESMAN_ShopID,   $SALESMAN_TerminalID,
                $SALESMAN_Ime,      $SALESMAN_Oib,
                $SALESMAN_Password, $SALESMAN_MagstripeRFU,
                $SALESMAN_MIID,     $SALESMAN_TIID
            ) = split(/\|/, $record);

            $control_buttons = qq~
            <INPUT TYPE=button  onClick=\"myForm.key.value='$k';myForm.search_field.value='all'; myForm.action.value='Edit_opera';this.form.submit();\"  VALUE=\"Uredi\" >
            <INPUT TYPE=button  onClick=DeleteDilemma(\"$k\");  VALUE=\"Izbriši\" >
            ~;

            # FETCH  $MIID_descriptor
            $MIID_descriptor = "";
            if ($SALESMAN_TerminalID 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, $TIID_descriptor) =
                      split(/\~/, $tid_complex);
                }
            }

            ($MIID_descriptor_name, $MIID_descriptor_address) =
              split(/\,/, $MIID_descriptor);

            print <<HTML;
  <tr>
   <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td> 
    <td valign="top" width="133"><p><strong>$SALESMAN_Ime</strong> </p></td>
    <td valign="top" width="116"><p>$SALESMAN_Oib </p></td>
    <td valign="top" width="150"><p>$MIID_descriptor_name</p></td>
    <td valign="top" width="140"><p>$TIID_descriptor</p></td>
    <td valign="top" width="118">$control_buttons</td>
  </tr>
HTML

        }    # End of foreach record loop.

        print qq~
        </TABLE></div>
        <br>


        <INPUT TYPE=button  onClick="myForm.action.value='new_card';this.form.submit();"  VALUE="Dodaj novog prodavača" >

        <br>

        ~;

        $which_search = $choose;

        &next_page_buttons($rows_left_to_view);
    }    # end of $search_oib, $company_id  ne ""

    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>";
    $cerca_t = $cerca;
    if ($cerca eq '.') {$cerca_t = 'tutto'}
    &html_footer;
}    # End of salesmen_listing subroutine.

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

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

    # Create terminal_select
    $terminal_select .=
qq~  <select name="TERMINAL_dropdown" id="TERMINAL_dropdown" onClick="setSelectedValues();" onChange="setSelectedValues();" onkeydown="return tabOnEnter (this, event);">~;

    $database_terminals =
      "$root/mercur/mercur_terminals.txt";  # Data file companies name and path

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

    foreach $adonis_record (@TT_line) {
        chomp $adonis_record;
        @altro = ();
        (
            $key, $dbuser, $when_added, $TERMINAL_TID, $TERMINAL_CompanyID,
            $TERMINAL_ShopID, $TERMINAL_TIID, @altro
        ) = split(/\|/, $adonis_record);

        $DBADONIS_hash{$key} = $adonis_record;
        if ($TERMINAL_CompanyID == $company_id) {
            my $tid_complex = &fetch_terminal_file($TERMINAL_TID);

            if ($tid_complex =~ /error/i) {
                print "$tid_complex<br>";
            }
            else {
                ($error_message, $MIID_descriptor, $TIID_descriptor) = split(
                    /\~/, $tid_complex
                  );
            }
            $terminal_select .=
qq~   <option value="$TERMINAL_TID:$TERMINAL_TIID:$TERMINAL_ShopID:$MIID_descriptor">  Uređaj: $TERMINAL_TIID - pj: $MIID_descriptor </option>~;

        }
    }

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

    # end of creating of terminal_select

    &html_header_mini;

    print <<HTML;

 </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 setSelectedValues(form) {
// assign values from drop down menu
      value_complex =document.getElementById("TERMINAL_dropdown").value;
      var myarray = value_complex.split(":");
      var shop_id = myarray[3].split(",");

      document.getElementById("SALESMAN_TerminalID").value =  myarray[0];
      document.getElementById("terminal_id").value =  myarray[0];
      document.getElementById("SALESMAN_TIID").value   =  myarray[1];
      document.getElementById("SALESMAN_ShopID").value =  myarray[2];
      document.getElementById("SALESMAN_MIID").value   =  shop_id[0];
// assign values from drop down menu       
}


 


 function validate(action) {
    var  success = true;
    var str = document.myForm.SALESMAN_Oib.value;
    document.myForm.SALESMAN_Oib.value = str.replace(" ", "", "gi");


        // cleanup the form, trim initial and terminal spaces in the form
        var form = document.forms["myForm"];

	for (var i=0; i<form.elements.length; i++) {
          x = form.elements[i].value;
          x = x.replace(/[^čćžšđČĆŽŠĐ\\-\\s\\:\\w\\/\\.\\,]/g, '' );
          x = x.replace(/\\_/g, '' );
          x = x.replace(/\\./g, '' );
          x = x.replace(/\\s+\$/, '' );
          x = x.replace(/^\\s+/, '' );

          form.elements[i].value =x;
	}

  
    if( document.myForm.SALESMAN_ShopID.value == "" )  {
      alert( "Molimo Vas, odaberite prodajnog mjesto i uređaj. " );
      success = false;
    } 

    if( document.myForm.SALESMAN_TIID.value == "" )  {
      alert( "Morate prethodno, dodjeliti uređaj za to prodajno mjesto. " );
      success = false;
    } 
 


    if( str == "" ||  isNaN( str ) || str.length != 11 )  {
        alert( "Molimo Vas, unesite ispravan OIB blagajnika, 11 znamenki." );
        document.myForm.SALESMAN_Oib.focus() ;
        success = false;
    } 
 

    var lozinka   = document.myForm.SALESMAN_Password.value;
    var regex1    =/\\W/;   //  only regular chaaracters 
    var lozinka_test1  = regex1.test(lozinka);
 
    if( lozinka.length <3 || lozinka.length >9 ||  lozinka_test1   )  {
      alert( "Unesite lozinku blagajnika, samo engleska slova i znamenke. Lozinka mora imati manje od 9  i najmanje 3 znaka." );
 
      document.myForm.SALESMAN_Password.focus() ;
      success = false;
    };
     

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

 }

//  End -->
</script>
<body >
<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> Novi prodavač</B>  </CENTER>

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


   <INPUT TYPE="hidden" NAME="key" value="$key">
   <INPUT TYPE="hidden" NAME="tid" value="$TERMINAL_TID">
   <INPUT TYPE="hidden" NAME="terminal_id" id="terminal_id" 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='';" >
 

</td>
         </TR>

<tr>
         <TD valign="top"><B>Odabir prodajnog mjesta i uređaja:</B></TD>
<TD>
$terminal_select
</TD>
</TR>

        <TR>
           <TD>companyID</TD>
           <TD><INPUT TYPE=TEXT NAME="SALESMAN_CompanyID" value="$company_id" id="SALESMAN_CompanyID" readonly onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
           <TD></TD>
           <TD><INPUT TYPE="hidden" NAME="SALESMAN_TerminalID" id="SALESMAN_TerminalID" readonly onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>


        <TR>
           <TD></TD>
           <TD><INPUT TYPE="hidden" NAME="SALESMAN_ShopID" id="SALESMAN_ShopID" readonly onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
           <TD><B>Jedinstveni identifikator prodajnog mjesta:</B></TD>
           <TD> <input name="SALESMAN_MIID" id="SALESMAN_MIID" value="$SALESMAN_MIID" size="20" readonly  autocomplete="off" /> </TD>
         </TR>


        <TR>
         <td><b>Jedinstveni identifikator  uređaja:</b></td>
         <td><input name="SALESMAN_TIID" id="SALESMAN_TIID" value="$SALESMAN_TIID" readonly size="20"  onkeydown="return tabOnEnter (this, event);" type="text"></td>
         </tr>

        <TR>
         <TD><B>Ime i prezime prodavača:</B></TD>
         <TD><INPUT TYPE="text" NAME="SALESMAN_Ime"  value=""  autocomplete="off" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>
        <TR>
         <TD><B>OIB prodavača:</B></TD>
         <TD><INPUT TYPE="text" NAME="SALESMAN_Oib" value="" autocomplete="off" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
         <TD><B>Lozinka prodavača:</B></TD>
         <TD><INPUT TYPE="password" NAME="SALESMAN_Password"  value="" autocomplete="off" onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>

        <TR>
         <TD></TD>
         <TD><INPUT TYPE="hidden" NAME="SALESMAN_MagstripeRFU"   onkeydown="return tabOnEnter (this, event);"  ></TD>
         </TR>


       	</tbody>  
       	</TABLE>
	<BR>
<INPUT TYPE=button  onClick="myForm.key.value='$key';myForm.tid.value='$TERMINAL_TID';validate('confirm_card');"  VALUE="Spremi" >

   <P>


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


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

</div>

HTML

    &html_footer;

}    # End of print_add_screen subroutine.

########### Search & Sort Database #############
sub search_db {
    my $search_for = $_[0];
    @results = ();

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

        if (/$search_for/oi) {push @results, $_}

    }    # End of while.
    close(DB);

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

        #  $message="No Matches Found For '$search_for'";
        $title = "Main Menu";
        &print_default($title, $message);
        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_db subroutine.

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

    &html_header($search_oib, $company_id);
    if (($search_oib ne "") && ($company_id ne "")) {
        print <<WWW;
  Pronađeno: 0 prodavača <br>
   <input onclick="myForm.action.value='new_card';this.form.submit();" value="Dodaj novog prodavača" type="button">
WWW
    }
    &html_footer;
}    # End of print_default subroutine.

########### Search & Sort Database #############
sub search_cid {
    my $search_for = shift;

    @results = ();
    my %record_smen = ();

    open(my $DB, "<", $database) or die "Error opening database.  $!\n";
    while (my $row = <$DB>) {
        my ($key, $dbuser, $when_added, $cid, @rest) = split(/\|/, $row);
        if ($cid == $search_for) {
            push @results, $row;
        }
    }    # End of while.
    close($DB);

####### sort
    foreach $curr (@results) {
        ($key, $dbuser, $when_added, @rest) = split(/\|/, $curr);
        $max  = @fields;
        $code = '$record_smen{$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

    @results = ();

    foreach $rp (
        sort {
                 $a->{SALESMAN_ShopID} cmp $b->{SALESMAN_ShopID}
              || $a->{SALESMAN_TerminalID} cmp $b->{SALESMAN_TerminalID}
              || $a->{SALESMAN_Ime} cmp $b->{SALESMAN_Ime}
        } values %record_smen
      )
    {

        $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
####### end of sorting

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

        #  $message="No Matches Found For '$search_for'";
        $title = "Main Menu";
        print_default($title, $message);

        exit;
    }

    my @results_with_terms;
    for my $res (@results) {
        my $tid = (split(/\|/, $res))[5];
        my $term = fetch_terminal_file($tid);
        push @results_with_terms, { res => $res, term => $term, tid => $tid };
    }

    @results = sort by_miid @results_with_terms;

    $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_cid 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,
        $TERMINAL_Status
    ) = 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);

    (
        $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);
    (
        $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 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;
        $SHOP_name =~ s/\;//g;

## 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;

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

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

        $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;    ############## $COMPANY_Status
        $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  #############

################# 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 #############

################# UpdateTerminalFiles_page ##################

sub UpdateTerminalFiles_page {
    my $TID = $_[0];
    $title = "Generate Parametric Files";
    &html_header($search_oib, $company_id);
    print
"Podaci za uređaj # $TID su spremni. 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 UpdateTerminalFiles_page subroutine.


################# 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;

    my $database =
      "$root/mercur/mercur_terminals.txt";  # Data file terminals name and path
    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,
            $TERMINAL_Status
        ) = 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 #############

################# 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, $_}

    }    # 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 #############

################# 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  #############

################# 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,
        $TERMINAL_Status
    ) = split(/\|/, $TERMINAL_record);

# print " <br>\n $when_added $TERMINAL_CompanyID:$TERMINAL_ShopID: $TERMINAL_TID <br> 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;

    if ($SHOP_ID > 0) {
        print
"<br>Ažurirana je lista korisnika na uređaju $TERMINAL_TIID ($TERMINAL_TID) koji se nalazi na prodajnom mjestu: <b>$SHOP_MIID</b> .. $SHOP_name, $SHOP_Adresa_Ulica, $SHOP_Adresa_KucniBroj ($SHOP_ID)<br>";
    }

    $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;

        $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 .= ";" . $COMPANY_Status;
        $TID_basic_record .= ";" . $COMPANY_Message;
        $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";
    }

    # 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);

    #   &validify_pricelist($TERMINAL_TID);
    #  end of assembling TID_UsersFile

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

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




################# 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;

# may be or not conserved the modification history
    if ($update_mode eq "conserve") {$key = time()}
    $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;
   $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);

    }
  } 

