-% # options example...
-% #
-% # #listrefs...
-% # 'header' => [ '#', 'Item' ],
-% # 'fields' => [
-% # 'column',
-% # sub { my ($row,$param) = @_; $param->{"column$row"}; },
-% # ],
-% # 'sizes' => [], # sizes ignored for immutable
-% # 'types' => ['immutable', ''], # immutable or ''/text
-% # 'param' => { column0 => 1 }, # preset column of row 0 to 1
-% #
+<%doc>
+
+Example:
+
+ include( '/elements/customer-table.html',
+
+ ###
+ # required
+ ###
+
+ #listrefs...
+ 'header' => [ '#', 'Item' ],
+ 'fields' => [
+ 'column',
+ sub { my ($row,$param) = @_;
+ $param->{"column$row"};
+ },
+ ],
+
+ ###
+ # optional
+ ###
+
+ 'name_singular' => 'customer', #label
+ 'custnum_update_callback' => 'name_of_js_callback' #passed a rownum
+
+ #listrefs
+ 'types' => ['immutable', ''], # immutable or ''/text
+ 'align' => [ 'c', 'l', 'r', '' ],
+ 'size' => [], # sizes ignored for immutable
+ 'color' => [],
+ 'footer' => ['string', '_TOTAL'], # strings or the special
+ #value _TOTAL
+ 'footer_align' => [ 'c', 'l', 'r', '' ],
+
+ 'param' => { column0 => 1 }, # preset column of row 0 to 1
+
+ )
+
+</%doc>
<SCRIPT TYPE="text/javascript">
+ function clearhint_invnum() {
+
+ if ( this.value == 'Not found' || this.value == 'Multiple' ) {
+ this.value = '';
+ this.style.color = '#000000';
+ }
+
+ }
+
function clearhint_custnum() {
if ( this.value == 'Not found' || this.value == 'Multiple' ) {
this.value = '';
}
+
+ function <% $opt{prefix} %>search_invnum() {
+
+ this.style.color = '#000000'
+
+ var invnum_obj = this;
+ var searchrow = this.getAttribute('rownum');
+ var invnum = this.value;
+
+ if ( invnum == 'searching...' || invnum == 'Not found' || invnum == '' )
+ return;
+
+ if ( this.getAttribute('magic') == 'nosearch' ) {
+ this.setAttribute('magic', '');
+ return;
+ }
+
+ if ( ( <% $opt{prefix} %>rownum - searchrow ) == 1 ) {
+ <% $opt{prefix} %>addRow();
+ }
+ var customer = document.getElementById('customer'+searchrow);
+ customer.value = 'searching...';
+ customer.disabled = true;
+ customer.style.color = '#000000';
+ customer.style.backgroundColor = '#dddddd';
+
+ var customer_select = document.getElementById('cust_select'+searchrow);
+
+ customer.style.display = '';
+ customer_select.style.display = 'none';
+
+ var custnum_obj = document.getElementById('custnum'+searchrow);
+ var balance = document.getElementById('balance'+searchrow);
+ var status = document.getElementById('status'+searchrow);
+ balance.innerHTML = '';
+ status.innerHTML = '';
+
+ function search_invnum_update(customers) {
+
+ var customerArray = eval('(' + customers + ')');
+
+ custnum_obj.disabled = false;
+ custnum_obj.style.backgroundColor = '#ffffff';
+ customer.disabled = false;
+ customer.style.backgroundColor = '#ffffff';
+
+ if ( customerArray.length == 0 ) {
+
+ custnum_obj.value = 'Not found';
+ customer.value = 'Not found';
+ custnum_obj.style.color = '#ff0000';
+ customer.style.color = '#ff0000';
+
+ customer.style.display = '';
+ customer_select.style.display = 'none';
+
+ } else if ( customerArray.length == 5 ) {
+
+ custnum_obj.value = customerArray[0];
+ custnum_obj.style.color = '#000000';
+ customer.value = customerArray[1];
+ balance.innerHTML = customerArray[2];
+ status.innerHTML = customerArray[3];
+ status.style.color = '#'+customerArray[4];
+
+ customer.style.display = '';
+ customer_select.style.display = 'none';
+
+% if ( $opt{invnum_update_callback} ) {
+ <% $opt{invnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
+
+ }
+
+ }
+
+ invnum_search( invnum, search_invnum_update );
+
+ }
+
function <% $opt{prefix} %>search_custnum() {
customer.style.display = '';
customer_select.style.display = 'none';
- function search_custnum_update(name) {
+ var invnum = document.getElementById('invnum'+searchrow);
+ invnum.value = '';
+
+ var balance = document.getElementById('balance'+searchrow);
+ balance.innerHTML = '';
+
+ var status = document.getElementById('status'+searchrow);
+ status.innerHTML = '';
- var name = eval('(' + name + ')' );
+ function search_custnum_update(customers) {
+
+ var customerArray = eval('(' + customers + ')');
customer.disabled = false;
customer.style.backgroundColor = '#ffffff';
+
+ if ( customerArray.length == 0 ) {
- if ( name.length > 0 ) {
- customer.value = name;
- customer.setAttribute('magic', 'nosearch');
- } else {
- customer.value = 'Not found';
+ customer.value = 'Not found';
customer.style.color = '#ff0000';
custnum_obj.style.color = '#ff0000';
- }
+ } else if ( customerArray.length == 5 ) {
+
+ custnum_obj.value = customerArray[0];
+ custnum_obj.style.color = '#000000';
+ customer.value = customerArray[1];
+ balance.innerHTML = customerArray[2];
+ status.innerHTML = customerArray[3];
+ status.style.color = '#'+customerArray[4];
+
+ customer.style.display = '';
+ customer_select.style.display = 'none';
+% if ( $opt{custnum_update_callback} ) {
+ <% $opt{custnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
+ }
}
- custnum_search( custnum, search_custnum_update );
+ custnum_search(custnum, search_custnum_update );
}
if ( ( <% $opt{prefix} %>rownum - searchrow ) == 1 ) {
<% $opt{prefix} %>addRow();
}
+
+ var invnum = document.getElementById('invnum'+searchrow);
+ invnum.value = '';
var custnum_obj = document.getElementById('custnum'+searchrow);
custnum_obj.value = 'searching...';
custnum_obj.style.backgroundColor = '#dddddd';
var customer_select = document.getElementById('cust_select'+searchrow);
+
+ var balance = document.getElementById('balance'+searchrow);
+ balance.innerHTML = '';
+
+ var status = document.getElementById('status'+searchrow);
+ status.innerHTML = '';
function search_customer_update(customers) {
customer_obj.style.display = '';
customer_select.style.display = 'none';
-
} else if ( customerArray.length == 1 ) {
custnum_obj.value = customerArray[0][0];
customer_obj.value = customerArray[0][1];
+ balance.innerHTML = customerArray[0][2];
+ status.innerHTML = customerArray[0][3];
+ status.style.color = '#'+customerArray[0][4];
customer_obj.style.display = '';
customer_select.style.display = 'none';
+% if ( $opt{custnum_update_callback} ) {
+ <% $opt{custnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
} else {
//add the multiple customers
for ( var s = 0; s < customerArray.length; s++ )
- opt(customer_select, customerArray[s][0], customerArray[s][1], '#000000');
+ opt(customer_select, customerArray[s][0] + '_' + customerArray[s][2] + '_' + customerArray[s][3] + '_' + customerArray[s][4], customerArray[s][1], '#000000');
opt(customer_select, 'cancel', '(Edit search string)', '#000000');
function select_customer() {
- var custnum = this.options[this.selectedIndex].value;
+ var custnum_balance_status = this.options[this.selectedIndex].value;
var customer = this.options[this.selectedIndex].text;
var searchrow = this.getAttribute('rownum');
var custnum_obj = document.getElementById('custnum'+searchrow);
var customer_obj = document.getElementById('customer'+searchrow);
+ var balance_obj = document.getElementById('balance'+searchrow);
+ var status_obj = document.getElementById('status'+searchrow);
- if ( custnum == '' ) {
+ if ( custnum_balance_status == '' ) {
- } else if ( custnum == 'cancel' ) {
+ } else if ( custnum_balance_status == 'cancel' ) {
custnum_obj.value = '';
custnum_obj.style.color = '#000000';
customer_obj.focus();
} else {
+
+ var pos_underscore1 = custnum_balance_status.indexOf('_');
+ var pos_underscore2 = custnum_balance_status.indexOf('_',pos_underscore1+1);
+ var pos_underscore3 = custnum_balance_status.indexOf('_',pos_underscore2+1);
+ var custnum = custnum_balance_status.substring(0,pos_underscore1);
+ var balance = custnum_balance_status.substring(pos_underscore1+1,pos_underscore2);
+ var status = custnum_balance_status.substring(pos_underscore2+1,pos_underscore3);
+ var color = custnum_balance_status.substring(pos_underscore3+1);
custnum_obj.value = custnum;
custnum_obj.style.color = '#000000';
customer_obj.value = customer;
customer_obj.style.color = '#000000';
+ balance_obj.innerHTML = balance;
+
+ status_obj.innerHTML = status;
+ status_obj.style.color = '#'+color;
+
this.style.display = 'none';
customer_obj.style.display = '';
+% if ( $opt{custnum_update_callback} ) {
+ <% $opt{custnum_update_callback} %>(searchrow, '<% $opt{prefix} %>')
+% }
+
}
}
<TABLE ID="<% $opt{prefix} %>OneTrueTable" BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0>
<TR>
+ <TH>Inv #</TH>
<TH>Cust #</TH>
+ <TH>Status</TH>
<TH>Customer</TH>
+ <TH>Balance</TH>
% foreach my $header ( @{$opt{header}} ) {
<TH><% $header %></TH>
% }
% for ( $row = 0; exists($param->{"custnum$row"}); $row++ ) {
<TR>
+ <TD>
+ <INPUT TYPE = "text"
+ NAME = "invnum<% $row %>"
+ ID = "invnum<% $row %>"
+ SIZE = 8
+ MAXLENGTH = 12
+ STYLE = "text-align:right;"
+ VALUE = "<% $param->{"invnum$row"} %>"
+ rownum = "<% $row %>"
+ >
+ <SCRIPT TYPE="text/javascript">
+ var invnum_input<% $row %> = document.getElementById("invnum<% $row %>");
+ invnum_input<% $row %>.onfocus = clearhint_invnum;
+ invnum_input<% $row %>.onchange = <% $opt{prefix} %>search_invnum;
+ </SCRIPT>
+ </TD>
<TD>
- <INPUT TYPE="text" NAME="custnum<% $row %>" ID="custnum<% $row %>" SIZE=8 MAXLENGTH=12 VALUE="<% $param->{"custnum$row"} %>" rownum="<% $row %>">
- <SCRIPT TYPE="text/javascript">
- var custnum_input<% $row %> = document.getElementById("custnum<% $row %>");
- custnum_input<% $row %>.onfocus = clearhint_custnum;
- custnum_input<% $row %>.onchange = <% $opt{prefix} %>search_custnum;
- </SCRIPT>
+ <INPUT TYPE = "text"
+ NAME = "custnum<% $row %>"
+ ID = "custnum<% $row %>"
+ SIZE = 8
+ MAXLENGTH = 12
+ STYLE = "text-align:right;"
+ VALUE = "<% $param->{"custnum$row"} %>"
+ rownum = "<% $row %>"
+ >
+ <SCRIPT TYPE="text/javascript">
+ var custnum_input<% $row %> = document.getElementById("custnum<% $row %>");
+ custnum_input<% $row %>.onfocus = clearhint_custnum;
+ custnum_input<% $row %>.onchange = <% $opt{prefix} %>search_custnum;
+ </SCRIPT>
+ </TD>
+
+ <TD>
+ <SPAN
+ NAME = "status<% $row %>"
+ ID = "status<% $row %>"
+ rownum = "<% $row %>"
+ STYLE = "text-align:center; font-weight: bold"
+ >
+ </SPAN>
</TD>
<TD>
% } else {
% $value = $param->{"$field$row"};
% }
-% my $name = (ref($field) eq 'CODE') ? "column${col}_$row" : "$field$row";
-% my $size = $sizes->[$col] || 10;
- <TD>
+% my $name = (ref($field) eq 'CODE') ? "column${col}_$row" : "$field$row";
+% my $align = $align{ $opt{align}->[$col] || 'l' };
+% my $size = $sizes->[$col] || 10;
+% my $color = $opt{color}->[$col];
+% my $font = $color ? qq(<FONT COLOR="$color">) : '';
+% my $onchange = '';
+% if ( $opt{footer}->[$col] eq '_TOTAL' ) {
+% $total[$col] += $value;
+% $onchange = $opt{prefix}. "calc_total$col();";
+% $onchange = qq(onchange="$onchange" onkeyup="$onchange");
+% }
+ <TD ALIGN="<% $align %>">
% if (! $types->[$col] || $types->[$col] eq 'text') {
- <INPUT TYPE="text" NAME="<% $name %>" SIZE="<% $size %>" VALUE="<% $value %>" >
+ <INPUT TYPE = "text"
+ NAME = "<% $name %>"
+ ID = "<% $name %>"
+ SIZE = "<% $size %>"
+ STYLE = "text-align: <% $align %>;"
+ VALUE = "<% $value %>"
+ <% $onchange %>
+ >
% } elsif ($types->[$col] eq 'immutable') {
- <% $value %>
- <INPUT TYPE="hidden" NAME="<% $name %>" VALUE="<% $value %>" >
+ <% $font %><% $value %><% $font ? '</FONT>' : '' %>
+ <INPUT TYPE="hidden" ID="<% $name %>" NAME="<% $name %>" VALUE="<% $value %>" >
% } else {
Cannot represent unknown type: <% $types->[$col] %>
% }
</TD>
% $col++;
% }
-
+ <TD>
+ <SPAN
+ NAME = "balance<% $row %>"
+ ID = "balance<% $row %>"
+ rownum = "<% $row %>"
+ STYLE = "text-align:center;"
+ >
+ </SPAN>
+ </TD>
</TR>
% }
+<TR>
+ <TH COLSPAN=5 ID="<% $opt{'prefix'} %>_TOTAL_TOTAL">
+ Total <% $row ? $row-1 : 0 %>
+ <% PL($opt{name_singular} || 'customer', ( $row ? $row-1 : 0 ) ) %>
+ </TH>
+% my $col = 0;
+% foreach my $footer ( @{$opt{footer}} ) {
+% my $align = $align{ $opt{'footer_align'}->[$col] || 'c' };
+% if ($footer eq '_TOTAL' ) {
+% my $id = $opt{'fields'}->[$col];
+% $id = ref($id) ? "column${col}_TOTAL" : "${id}_TOTAL";
+ <TH ALIGN="<% $align %>" ID="<% $id %>"> <% sprintf('%.2f', $total[$col] ) %></TH>
+% } else {
+ <TH ALIGN="<% $align %>"><% $footer %></TH>
+% }
+% $col++;
+% }
+</TR>
</TABLE>
+<SCRIPT TYPE="text/javascript">
+% my $col = 0;
+% foreach my $footer ( @{$opt{footer}} ) {
+% if ($footer eq '_TOTAL' ) {
+% my $name = $opt{fields}->[$col];
+% $name = ref($name) ? "column$col" : $name;
+ var <% $opt{prefix}.$name %>_CACHE = new Array ();
+ var <% $opt{prefix} %>th_el = document.getElementById("<%$name%>_TOTAL");
+ function <% $opt{prefix} %>calc_total<% $col %>() {
+ var row = 0;
+ var total = 0;
+ for ( var row = 0;
+
+ ( <% $opt{prefix}.$name%>_CACHE[row] =
+ <% $opt{prefix}.$name%>_CACHE[row]
+ || document.getElementById("<%$name%>"+row)
+ ) != null;
+
+ row++
+ )
+ {
+ var value = <%$name%>_CACHE[row].value;
+ value = parseFloat(value);
+ if ( ! isNaN(value) ) {
+ total = total + value;
+ }
+ }
+ <% $opt{prefix} %>th_el.innerHTML = ' ' + total.toFixed(2);
+
+ }
+% }
+% $col++;
+% }
+</SCRIPT>
+
<% include('/elements/xmlhttp.html',
'url' => $p. 'misc/xmlhttp-cust_main-search.cgi',
- 'subs' => [qw( custnum_search smart_search )],
+ 'subs' => [qw( custnum_search smart_search invnum_search )],
)
%>
<SCRIPT TYPE="text/javascript">
+ var <% $opt{prefix} %>total_el =
+ document.getElementById("<% $opt{'prefix'} %>_TOTAL_TOTAL");
+
var <% $opt{prefix} %>rownum = <% $row %>;
function <% $opt{prefix} %>addRow() {
var table = document.getElementById('<% $opt{prefix} %>OneTrueTable');
var tablebody = table.getElementsByTagName('tbody').item(0);
- var row = document.createElement('TR');
+ var row = table.insertRow(rownum+1);
+
+ var invnum_cell = document.createElement('TD');
+
+ var invnum_input = document.createElement('INPUT');
+ invnum_input.setAttribute('name', 'invnum'+<% $opt{prefix} %>rownum);
+ invnum_input.setAttribute('id', 'invnum'+<% $opt{prefix} %>rownum);
+ invnum_input.style.textAlign = 'right';
+ invnum_input.setAttribute('size', 8);
+ invnum_input.setAttribute('maxlength', 12);
+ invnum_input.setAttribute('rownum', <% $opt{prefix} %>rownum);
+ invnum_input.onfocus = clearhint_invnum;
+ invnum_input.onchange = <% $opt{prefix} %>search_invnum;
+ invnum_cell.appendChild(invnum_input);
+
+ row.appendChild(invnum_cell);
var custnum_cell = document.createElement('TD');
var custnum_input = document.createElement('INPUT');
custnum_input.setAttribute('name', 'custnum'+<% $opt{prefix} %>rownum);
custnum_input.setAttribute('id', 'custnum'+<% $opt{prefix} %>rownum);
+ custnum_input.style.textAlign = 'right';
custnum_input.setAttribute('size', 8);
custnum_input.setAttribute('maxlength', 12);
custnum_input.setAttribute('rownum', <% $opt{prefix} %>rownum);
custnum_cell.appendChild(custnum_input);
row.appendChild(custnum_cell);
+
+ var status_cell = document.createElement('TD');
+
+ var status_span = document.createElement('SPAN');
+ status_span.setAttribute('name', 'status'+<% $opt{prefix} %>rownum);
+ status_span.setAttribute('id', 'status'+<% $opt{prefix} %>rownum);
+ status_span.style.textAlign = 'center';
+ status_span.style.fontWeight = 'bold';
+ status_span.setAttribute('rownum', <% $opt{prefix} %>rownum);
+ status_cell.appendChild(status_span);
+
+ row.appendChild(status_cell);
var customer_cell = document.createElement('TD');
customer_cell.appendChild(customer_select);
row.appendChild(customer_cell);
+
+ var balance_cell = document.createElement('TD');
+
+ var balance_span = document.createElement('SPAN');
+ balance_span.setAttribute('name', 'balance'+<% $opt{prefix} %>rownum);
+ balance_span.setAttribute('id', 'balance'+<% $opt{prefix} %>rownum);
+ balance_span.style.textAlign = 'center';
+ balance_span.setAttribute('rownum', <% $opt{prefix} %>rownum);
+ balance_cell.appendChild(balance_span);
+
+ row.appendChild(balance_cell);
% my $col = 0;
% foreach my $field ( @{$opt{fields}} ) {
- var my_cell = document.createElement('TD');
+
+ var my_cell = document.createElement('TD');
+ my_cell.setAttribute('align', '<% $align{ $opt{align}->[$col] || 'l' } %>');
% if ($types->[$col] eq 'immutable') {
% my $value;
var my_input = document.createElement('INPUT');
my_input.setAttribute('name', '<% $field %>'+<% $opt{prefix} %>rownum);
+ my_input.setAttribute('id', '<% $field %>'+<% $opt{prefix} %>rownum);
+ my_input.style.textAlign = '<% $align{ $opt{align}->[$col] || 'l' } %>';
my_input.setAttribute('size', <% $sizes->[$col] || 10 %>);
% if ($types->[$col] eq 'immutable') {
my_input.setAttribute('type', 'hidden');
+% }
+% if ( $opt{footer}->[$col] eq '_TOTAL' ) {
+ my_input.onchange = <% $opt{prefix} %>calc_total<%$col%>;
+ my_input.onkeyup = <% $opt{prefix} %>calc_total<%$col%>;
% }
my_cell.appendChild(my_input);
% $col++;
% }
- tablebody.appendChild(row);
+ //update the total # of rows display
+ if ( <% $opt{prefix} %>rownum == 1 ) {
+ <% $opt{prefix} %>total_el.innerHTML =
+ 'Total '
+ + <% $opt{prefix} %>rownum
+ + ' <% $opt{name_singular} || 'customer' %>';
+ } else {
+ <% $opt{prefix} %>total_el.innerHTML =
+ 'Total '
+ + <% $opt{prefix} %>rownum
+ + ' <% PL($opt{name_singular} || 'customer') %>';
+ }
<% $opt{prefix} %>rownum++;
$opt{prefix} .= '_' if $opt{prefix};
my $types = $opt{'types'} ? [ @{$opt{'types'}} ] : [];
-my $sizes = $opt{'sizes'} ? [ @{$opt{'sizes'}} ] : [];
+my $sizes = $opt{'size'} ? [ @{$opt{'size'}} ] : [];
my $param = $opt{param};
$param = $cgi->Vars if $cgi->param('error');
+$opt{$_} ||= [] foreach qw(align color footer footer_align);
+
+my @total = map 0, @{$opt{footer}};
+
+my %align = (
+ 'l' => 'left',
+ 'r' => 'right',
+ 'c' => 'center',
+);
+
</%init>