diff options
Diffstat (limited to 'fs_selfservice/FS-SelfService/cgi')
104 files changed, 7637 insertions, 0 deletions
diff --git a/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html b/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html new file mode 100644 index 000000000..9cdb65e36 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html @@ -0,0 +1,10 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Payment results') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error processing your payment: $error</FONT>!; +} else { + $OUT .= 'Your payment was processed successfully. Thank you.'; +} %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/agent.cgi b/fs_selfservice/FS-SelfService/cgi/agent.cgi new file mode 100644 index 000000000..6e8de619a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent.cgi @@ -0,0 +1,458 @@ +#!/usr/bin/perl -T +#!/usr/bin/perl -Tw + +#some false laziness w/selfservice.cgi + +use strict; +use vars qw($DEBUG $me $cgi $session_id $form_max $template_dir); +use subs qw(do_template); +use CGI; +use CGI::Carp qw(fatalsToBrowser); +use Business::CreditCard; +use Text::Template; +#use HTML::Entities; +use FS::SelfService qw( agent_login agent_logout agent_info + agent_list_customers + signup_info new_customer + customer_info list_pkgs order_pkg + part_svc_info provision_acct provision_external + unprovision_svc + ); + +$DEBUG = 0; +$me = 'agent.cgi:'; + +$template_dir = '.'; + +$form_max = 255; + +warn "$me starting\n" if $DEBUG; + +warn "$me initializing CGI\n" if $DEBUG; +$cgi = new CGI; + +unless ( defined $cgi->param('session') ) { + warn "$me no session defined, sending login page\n" if $DEBUG; + do_template('agent_login',{}); + exit; +} + +if ( $cgi->param('session') eq 'login' ) { + + warn "$me processing login\n" if $DEBUG; + + $cgi->param('username') =~ /^\s*([a-z0-9_\-\.\&]{0,$form_max})\s*$/i + or die "illegal username"; + my $username = $1; + + $cgi->param('password') =~ /^(.{0,$form_max})$/ + or die "illegal password"; + my $password = $1; + + my $rv = agent_login( + 'username' => $username, + 'password' => $password, + ); + if ( $rv->{error} ) { + do_template('agent_login', { + 'error' => $rv->{error}, + 'username' => $username, + } ); + exit; + } else { + $cgi->param('session' => $rv->{session_id} ); + $cgi->param('action' => 'agent_main' ); + } +} + +$session_id = $cgi->param('session'); + +warn "$me checking action\n" if $DEBUG; +$cgi->param('action') =~ + /^(agent_main|signup|process_signup|list_customers|view_customer|agent_provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|agent_order_pkg|process_order_pkg|logout)$/ + or die "unknown action ". $cgi->param('action'); +my $action = $1; + +warn "$me running $action\n" if $DEBUG; +my $result = eval "&$action();"; +die $@ if $@; + +if ( $result->{error} eq "Can't resume session" ) { #ick + do_template('agent_login',{}); + exit; +} + +warn "$me processing template $action\n" if $DEBUG; +do_template($action, { + 'session_id' => $session_id, + %{$result} +}); +warn "$me done processing template $action\n" if $DEBUG; + +#-- + +sub logout { + $action = 'agent_logout'; + agent_logout( 'session_id' => $session_id ); +} + +sub agent_main { agent_info( 'session_id' => $session_id ); } + +sub signup { signup_info( 'session_id' => $session_id ); } + +sub process_signup { + + my $init_data = signup_info( 'session_id' => $session_id ); + if ( $init_data->{'error'} ) { + if ( $init_data->{'error'} eq "Can't resume session" ) { #ick + do_template('agent_login',{}); + exit; + } else { #? + die $init_data->{'error'}; + } + } + + my $error = ''; + + #false laziness w/signup.cgi, identical except for agentnum vs session_id + my $payby = $cgi->param('payby'); + if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) { + #$payinfo = join('@', map { $cgi->param( $payby. "_payinfo$_" ) } (1,2) ); + $cgi->param('payinfo' => $cgi->param($payby. '_payinfo1'). '@'. + $cgi->param($payby. '_payinfo2') + ); + } else { + $cgi->param('payinfo' => $cgi->param( $payby. '_payinfo' ) ); + } + $cgi->param('paydate' => $cgi->param( $payby. '_month' ). '-'. + $cgi->param( $payby. '_year' ) + ); + $cgi->param('payname' => $cgi->param( $payby. '_payname' ) ); + $cgi->param('paycvv' => defined $cgi->param( $payby. '_paycvv' ) + ? $cgi->param( $payby. '_paycvv' ) + : '' + ); + + if ( $cgi->param('invoicing_list') ) { + $cgi->param('invoicing_list' => $cgi->param('invoicing_list'). ', POST') + if $cgi->param('invoicing_list_POST'); + } else { + $cgi->param('invoicing_list' => 'POST' ); + } + + if ( $cgi->param('_password') ne $cgi->param('_password2') ) { + $error = $init_data->{msgcat}{passwords_dont_match}; #msgcat + $cgi->param('_password', ''); + $cgi->param('_password2', ''); + } + + if ( $payby =~ /^(CARD|DCRD)$/ && $cgi->param('CARD_type') ) { + my $payinfo = $cgi->param('payinfo'); + $payinfo =~ s/\D//g; + + $payinfo =~ /^(\d{13,16})$/ + or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + $payinfo = $1; + validate($payinfo) + or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + cardtype($payinfo) eq $cgi->param('CARD_type') + or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type'); + } + + unless ( $error ) { + my $rv = new_customer ( { + 'session_id' => $session_id, + map { $_ => scalar($cgi->param($_)) } + qw( last first ss company + address1 address2 city county state zip country + daytime night fax + + ship_last ship_first ship_company + ship_address1 ship_address2 ship_city ship_county ship_state + ship_zip ship_country + ship_daytime ship_night ship_fax + + payby payinfo paycvv paydate payname invoicing_list + referral_custnum promo_code reg_code + pkgpart username sec_phrase _password popnum refnum + ), + grep { /^snarf_/ } $cgi->param + } ); + $error = $rv->{'error'}; + } + #eslaf + + if ( $error ) { + $action = 'signup'; + my $r = { + $cgi->Vars, + %{$init_data}, + 'error' => $error, + }; + #warn join('\n', map "$_ => $r->{$_}", keys %$r )."\n"; + $r; + } else { + $action = 'agent_main'; + my $agent_info = agent_info( 'session_id' => $session_id ); + $agent_info->{'message'} = 'Signup successful'; + $agent_info; + } + +} + +sub list_customers { + + my $results = + agent_list_customers( 'session_id' => $session_id, + map { $_ => $cgi->param($_) } + grep defined($cgi->param($_)), + qw(prospect active susp cancel), + 'search', + ); + + if ( scalar( @{$results->{'customers'}} ) == 1 ) { + $action = 'view_customer'; + customer_info ( + 'agent_session_id' => $session_id, + 'custnum' => $results->{'customers'}[0]{'custnum'}, + ); + } else { + $results; + } + +} + +sub view_customer { + + #my $init_data = signup_info( 'session_id' => $session_id ); + #if ( $init_data->{'error'} ) { + # if ( $init_data->{'error'} eq "Can't resume session" ) { #ick + # do_template('agent_login',{}); + # exit; + # } else { #? + # die $init_data->{'error'}; + # } + #} + # + #my $customer_info = + customer_info ( + 'agent_session_id' => $session_id, + 'custnum' => $cgi->param('custnum'), + ); + # + #return { + # ( map { $_ => $init_data->{$_} } + # qw( part_pkg security_phrase svc_acct_pop ), + # ), + # %$customer_info, + #}; +} + +sub agent_order_pkg { + + my $init_data = signup_info( 'session_id' => $session_id ); + if ( $init_data->{'error'} ) { + if ( $init_data->{'error'} eq "Can't resume session" ) { #ick + do_template('agent_login',{}); + exit; + } else { #? + die $init_data->{'error'}; + } + } + + my $customer_info = customer_info ( + 'agent_session_id' => $session_id, + 'custnum' => $cgi->param('custnum'), + ); + + return { + ( map { $_ => $init_data->{$_} } + qw( part_pkg security_phrase svc_acct_pop ), + ), + %$customer_info, + }; + +} + +sub agent_provision { + my $result = list_pkgs( + 'agent_session_id' => $session_id, + 'custnum' => $cgi->param('custnum'), + ); + die $result->{'error'} if exists $result->{'error'} && $result->{'error'}; + $result; +} + +sub provision_svc { + + my $result = part_svc_info( + 'agent_session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( pkgnum svcpart custnum ), + ); + die $result->{'error'} if exists $result->{'error'} && $result->{'error'}; + + $result->{'svcdb'} =~ /^svc_(.*)$/ + #or return { 'error' => 'Unknown svcdb '. $result->{'svcdb'} }; + or die 'Unknown svcdb '. $result->{'svcdb'}; + $action .= "_$1"; + $action = "agent_$action"; + + $result; +} + +sub process_svc_acct { + + my $result = provision_acct ( + 'agent_session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( + custnum pkgnum svcpart username _password _password2 sec_phrase popnum ) + ); + + if ( exists $result->{'error'} && $result->{'error'} ) { + #warn "$result $result->{'error'}"; + $action = 'provision_svc_acct'; + $action = "agent_$action"; + return { + $cgi->Vars, + %{ part_svc_info( 'agent_session_id' => $session_id, + map { $_ => $cgi->param($_) } qw(pkgnum svcpart custnum) + ) + }, + 'error' => $result->{'error'}, + }; + } else { + #warn "$result $result->{'error'}"; + $action = 'agent_provision'; + return { + %{agent_provision()}, + 'message' => $result->{'svc'}. ' setup successfully.', + }; + } + +} + +sub process_svc_external { + + my $result = provision_external ( + 'agent_session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( custnum pkgnum svcpart ) + ); + + #warn "$result $result->{'error'}"; + $action = 'agent_provision'; + return { + %{agent_provision()}, + 'message' => $result->{'error'} + ? '<FONT COLOR="#FF0000">'. $result->{'error'}. '</FONT>' + : $result->{'svc'}. ' setup successfully'. + ': serial number '. + sprintf('%010d', $result->{'id'}). '-'. $result->{'title'} + }; + +} + +sub delete_svc { + my $result = unprovision_svc( + 'agent_session_id' => $session_id, + 'custnum' => $cgi->param('custnum'), + 'svcnum' => $cgi->param('svcnum'), + ); + + $action = 'agent_provision'; + + return { + %{agent_provision()}, + 'message' => $result->{'error'} + ? '<FONT COLOR="#FF0000">'. $result->{'error'}. '</FONT>' + : $result->{'svc'}. ' removed.' + }; + +} + +sub process_order_pkg { + + my $results = ''; + + unless ( length($cgi->param('_password')) ) { + my $init_data = signup_info( 'session_id' => $session_id ); + #die $init_data->{'error'} if $init_data->{'error'}; + $results = { 'error' => $init_data->{msgcat}{empty_password} }; + } + if ( $cgi->param('_password') ne $cgi->param('_password2') ) { + my $init_data = signup_info( 'session_id' => $session_id ); + $results = { 'error' => $init_data->{msgcat}{passwords_dont_match} }; + $cgi->param('_password', ''); + $cgi->param('_password2', ''); + } + + $results ||= order_pkg ( + 'agent_session_id' => $session_id, + map { $_ => $cgi->param($_) } + qw( custnum pkgpart username _password _password2 sec_phrase popnum ) + ); + + if ( $results->{'error'} ) { + $action = 'agent_order_pkg'; + return { + $cgi->Vars, + %{agent_order_pkg()}, + #'message' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>', + 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>', + }; + } else { + $action = 'view_customer'; + #$cgi->delete( grep { $_ ne 'custnum' } $cgi->param ); + return { + %{view_customer()}, + 'message' => 'Package order successful.', + }; + } + +} + +#-- + +sub do_template { + my $name = shift; + my $fill_in = shift; + #warn join(' / ', map { "$_=>".$fill_in->{$_} } keys %$fill_in). "\n"; + + $cgi->delete_all(); + $fill_in->{'selfurl'} = $cgi->self_url; #OLD + $fill_in->{'self_url'} = $cgi->self_url; + $fill_in->{'cgi'} = \$cgi; + + my $template = new Text::Template( TYPE => 'FILE', + SOURCE => "$template_dir/$name.html", + DELIMITERS => [ '<%=', '%>' ], + UNTAINT => 1, ) + or die $Text::Template::ERROR; + + local $^W = 0; + print $cgi->header( '-expires' => 'now' ), + $template->fill_in( PACKAGE => 'FS::SelfService::_agentcgi', + HASH => $fill_in + ); +} + +package FS::SelfService::_agentcgi; + +use HTML::Entities; +use FS::SelfService qw(regionselector expselect popselector); + +#false laziness w/selfservice.cgi +sub include { + my $name = shift; + my $template = new Text::Template( TYPE => 'FILE', + SOURCE => "$main::template_dir/$name.html", + DELIMITERS => [ '<%=', '%>' ], + UNTAINT => 1, + ) + or die $Text::Template::ERROR; + + $template->fill_in( PACKAGE => 'FS::SelfService::_agentcgi', + #HASH => $fill_in + ); + +} + diff --git a/fs_selfservice/FS-SelfService/cgi/agent_customer_menu.html b/fs_selfservice/FS-SelfService/cgi/agent_customer_menu.html new file mode 100644 index 000000000..603fc0bd2 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_customer_menu.html @@ -0,0 +1,7 @@ +<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %> +<TD VALIGN="top" HEIGHT=384 BGCOLOR="#dddddd"> +<A HREF="<%= $url %>agent_provision">Setup services</A><BR><BR> +<A HREF="<%= $url %>agent_order_pkg">Purchase additional package</A><BR><BR> + +</TD> + diff --git a/fs_selfservice/FS-SelfService/cgi/agent_delete_svc.html b/fs_selfservice/FS-SelfService/cgi/agent_delete_svc.html new file mode 100644 index 000000000..63fa127b2 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_delete_svc.html @@ -0,0 +1,17 @@ +<HTML><HEAD><TITLE>MyAccount</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>MyAccount</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('myaccount_menu') %> +<TD VALIGN="top"> +<%= $small_custview %> +<BR> +<%= if ( $error ) { + + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT>!; +} else { + $OUT .= "<FONT SIZE=4>$svc removed.</FONT>"; +} %> + +</TD></TR></TABLE> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/agent_login.html b/fs_selfservice/FS-SelfService/cgi/agent_login.html new file mode 100644 index 000000000..4b0778ec5 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_login.html @@ -0,0 +1,22 @@ +<HTML><HEAD><TITLE>Reseller Login</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=5>Reseller Login</FONT><BR><BR> +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> +<FORM ACTION="<%= $self_url %>" METHOD=POST> +<INPUT TYPE="hidden" NAME="session" VALUE="login"> +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=2 CELLPADDING=0> +<TR> + <TH ALIGN="right">Username </TH> + <TD> + <INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"> + </TD> +</TR> +<TR> + <TH ALIGN="right">Password </TH> + <TD> + <INPUT TYPE="password" NAME="password"> + </TD> +</TR> +</TABLE> +<BR><BR><INPUT TYPE="submit" VALUE="Login"> +</FORM></BODY></HTML> + diff --git a/fs_selfservice/FS-SelfService/cgi/agent_logout.html b/fs_selfservice/FS-SelfService/cgi/agent_logout.html new file mode 100644 index 000000000..98094679a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_logout.html @@ -0,0 +1,5 @@ +<HTML><HEAD><TITLE>Reseller</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR> +You have been logged out. +</BODY></HTML> + diff --git a/fs_selfservice/FS-SelfService/cgi/agent_main.html b/fs_selfservice/FS-SelfService/cgi/agent_main.html new file mode 100644 index 000000000..3aefd61b1 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_main.html @@ -0,0 +1,33 @@ +<HTML><HEAD><TITLE>Reseller</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_menu') %> +<TD VALIGN="top"> + +<%= $message + ? "<FONT SIZE=\"+2\"><B>$message</B></FONT>" + : "Hello $agent!" +%><BR><BR> + +<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#eeeeee"> +<TR><TH BGCOLOR="#cccccc">Customer summary</TH></TR> +<TR><TD BGCOLOR="#dddddd"> + + <B><%= $num_prospect %></B> + <%= $num_prospect ? qq!<A HREF="${url}list_customers;prospect=1">! : '' %>prospects</A> + + <BR><FONT COLOR="#00CC00"><B><%= $num_active %></B></FONT> + <%= $num_active ? qq!<A HREF="${url}list_customers;active=1">! : '' %>active</A> + + <BR><FONT COLOR="#FF9900"><B><%= $num_susp %></B></FONT> + <%= $num_susp ? qq!<A HREF="${url}list_customers;susp=1">! : '' %>suspended</A> + + <BR><FONT COLOR="#FF0000"><B><%= $num_cancel %></B></FONT> + <%= $num_cancel ? qq!<A HREF="${url}list_customers;cancel=1">! : '' %>cancelled</A> + +</TD></TR></TABLE> + +</TD></TR></TABLE> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/agent_menu.html b/fs_selfservice/FS-SelfService/cgi/agent_menu.html new file mode 100644 index 000000000..84a295304 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_menu.html @@ -0,0 +1,15 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<TD VALIGN="top" HEIGHT=384 BGCOLOR="#dddddd"> + +<A HREF="<%= $url %>agent_main">Overview</A><BR><BR> +<A HREF="<%= $url %>signup">New customer<!--/prospect--></A><BR><BR> +<FORM ACTION="<%= $selfurl %>"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="list_customers"> +<INPUT TYPE="text" NAME="search" SIZE=20><BR> +<SMALL><I>cust #, last name, or company</I></SMALL><BR> +<INPUT TYPE="submit" VALUE="Search customers"><BR> +</FORM> +<A HREF="<%= $url %>logout">Logout</A><BR><BR> + +</TD> diff --git a/fs_selfservice/FS-SelfService/cgi/agent_order_pkg.html b/fs_selfservice/FS-SelfService/cgi/agent_order_pkg.html new file mode 100644 index 000000000..18a37e891 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_order_pkg.html @@ -0,0 +1,18 @@ +<HTML><HEAD><TITLE>Reseller</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %> +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_menu') %> +<TD VALIGN="top"> +<%= $small_custview %> +<BR> + +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_customer_menu') %> +<TD VALIGN="top"> +<%= include('order_pkg') %> +</TD></TR></TABLE> + +</TD></TR></TABLE> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/agent_provision.html b/fs_selfservice/FS-SelfService/cgi/agent_provision.html new file mode 100644 index 000000000..f7f39b513 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_provision.html @@ -0,0 +1,23 @@ +<HTML><HEAD><TITLE>Reseller</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %> +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_menu') %> +<TD VALIGN="top"> + +<%= $message + ? "<FONT SIZE=\"+2\"><B>$message</B></FONT><BR><BR>" + : '' +%> + +<%= $small_custview %> +<BR> + +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_customer_menu') %> +<TD VALIGN="top"> +<%= include('provision_list') %> +</TD></TR></TABLE> + +</TD></TR></TABLE> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/agent_provision_svc_acct.html b/fs_selfservice/FS-SelfService/cgi/agent_provision_svc_acct.html new file mode 100644 index 000000000..a867edb08 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/agent_provision_svc_acct.html @@ -0,0 +1,16 @@ +<HTML><HEAD><TITLE>Reseller</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;custnum=$custnum;action="; ''; %> +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_menu') %> +<TD VALIGN="top"> +<%= $small_custview %> +<BR> +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_customer_menu') %> +<TD VALIGN="top"> +<%= include('svc_acct') %> +</TD></TR></TABLE> + +</TD></TR></TABLE> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/bill.html b/fs_selfservice/FS-SelfService/cgi/bill.html new file mode 100644 index 000000000..a3884e0f2 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/bill.html @@ -0,0 +1,15 @@ +<TR> + <TD ALIGN="right">P.O. number</TD> + <TD><INPUT TYPE="text" NAME="payinfo" SIZE=10 MAXLENGTH=20 VALUE="<%=$payinfo%>"></TD> +</TR><TR> + <TD ALIGN="right">Attention</TD> + <TD><INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="payname" VALUE="<%=$payname%>"></TD> +</TR><TR> + <TD ALIGN="right">Postal mail invoice</TD> + <TD><INPUT TYPE="checkbox" NAME="postal_invoicing" VALUE="POST" <%= + $postal_invoicing ? 'CHECKED' : '' + %>></TD> +</TR><TR> + <TD>Email address(es)</TD> + <TD><INPUT TYPE="text" NAME="invoicing_list" VALUE="<%= join(',', $invoicing_list ) %>"></TD> +</TR> diff --git a/fs_selfservice/FS-SelfService/cgi/card.html b/fs_selfservice/FS-SelfService/cgi/card.html new file mode 100644 index 000000000..c7db2b398 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/card.html @@ -0,0 +1,47 @@ +<TR> + <TH ALIGN="right">Card number</TH> + <TD COLSPAN=6> + <TABLE> + <TR> + <TD> + <INPUT TYPE="text" NAME="payinfo" SIZE=20 MAXLENGTH=19 VALUE="<%=$payinfo%>"> </TD> + <TH>Exp.</TH> + <TD> + <SELECT NAME="month"> + <%= for ( ( map "0$_", 1 .. 9 ), 10 .. 12 ) { + $OUT .= '<OPTION'. ($_ == $month ? ' SELECTED' : ''). ">$_\n"; + } %> + </SELECT> + </TD> + <TD> / </TD> + <TD> + <SELECT NAME="year"> + <%= my @a = localtime; for ( $a[5]+1900 .. $a[5]+1915 ) { + $OUT .= '<OPTION'. ($_ == $year ? ' SELECTED' : ''). ">$_\n"; + } %> + </SELECT> + </TD> + </TR> + </TABLE> + </TD> +</TR> +<%= + if ( $withcvv ) { + $OUT .= qq!<TR>!; + $OUT .= qq!<TD ALIGN="right">CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)</TD>!; + $OUT .= qq!<TD><INPUT TYPE="text" NAME="paycvv" VALUE="" SIZE=4 MAXLENGTH=4></TD>!; + $OUT .= qq!</TR>!; + } + ''; +%> +<TR> + <TH ALIGN="right">Exact name on card</TH> + <TD COLSPAN=6><INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="payname" VALUE="<%=$payname%>"></TD> +</TR> + +<%= location_form( 'session_id' => $session_id, + 'no_asterisks' => 1, + #'address1_label' => 'Card billing address', + 'address1_label' => 'Card billing address', + ) +%> diff --git a/fs_selfservice/FS-SelfService/cgi/change_bill.html b/fs_selfservice/FS-SelfService/cgi/change_bill.html new file mode 100755 index 000000000..7941971ba --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/change_bill.html @@ -0,0 +1,19 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Edit billing address') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT><BR><BR>!; +} ''; %> + +<FORM NAME="ChangeBillForm" ACTION="<%= $selfurl %>" METHOD=POST onSubmit="document.bottomform.submit.disabled=true;"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_change_bill"> +<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0> + +<%= $r=qq!<font color="#ff0000">*</font> !; include('contact') %> + +<INPUT TYPE="submit" NAME="submit" VALUE="<%= $custnum ? "Apply Changes" : "Add Customer" %>"> +<BR> +</FORM> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/change_password.html b/fs_selfservice/FS-SelfService/cgi/change_password.html new file mode 100644 index 000000000..68b6fd824 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/change_password.html @@ -0,0 +1,46 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Change password') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} ''; %> + +<FORM ACTION="<%= $selfurl %>" METHOD="POST"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_change_password"> + +<TABLE BGCOLOR="#cccccc"> + + <TR> + <TH ALIGN="right">Change password for account: </TH> + <TD> + <SELECT NAME="svcnum"> + <%= foreach my $svc ( @svcs ) { + $OUT .= '<OPTION VALUE="'. $svc->{'svcnum'}. '"'. + ( $svc->{'svcnum'} eq $svcnum ? ' SELECTED' : '' ). '>'. + $svc->{'label'}. ': '. $svc->{'value'}. "\n"; + } + %> + </SELECT> + </TD> + </TR> + + <TR> + <TH ALIGN="right">New password: </TH> + <TD><INPUT TYPE="password" NAME="new_password" SIZE="18"></TD> + </TR> + + <TR> + <TH ALIGN="right">Re-enter new password: </TH> + <TD><INPUT TYPE="password" NAME="new_password2" SIZE="18"></TD> + </TR> + +</TABLE> +<BR> + +<INPUT TYPE="submit" VALUE="Change password"> + +</FORM> + + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/change_pay.html b/fs_selfservice/FS-SelfService/cgi/change_pay.html new file mode 100644 index 000000000..9633e8920 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/change_pay.html @@ -0,0 +1,69 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Change payment information') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT><BR><BR>!; + } ''; %> + +<FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true"> +<%= + use Tie::IxHash; + use HTML::Widgets::SelectLayers; + + my $preauto = '<TR><TD COLSPAN=3><INPUT TYPE="checkbox" NAME="auto" VALUE="1"'; + my $postauto = '>Charge future payments to this card automatically</TD></TR>'; + + my $tail = qq(</TABLE><INPUT TYPE="hidden" NAME="session" VALUE="$session_id">). + qq(<INPUT TYPE="hidden" NAME="action" VALUE="process_change_pay">). + qq(<BR>). + qq(<INPUT TYPE="submit" NAME="process" ). + qq(VALUE="Save payment information"> ). + qq(<!-- onClick="this.disabled=true"> -->); + + + my %paybychecked = ( + 'BILL' => include('bill'), + 'CARD' => include('card')."$preauto CHECKED $postauto", + 'DCRD' => include('card')."$preauto $postauto", + 'CHEK' => include('check')."$preauto CHECKED $postauto", + 'DCHK' => include('check')."$preauto $postauto", + ); + my %payby_index = ( 'CARD' => qq/Credit Card/, + 'DCRD' => qq/Credit Card/, + 'CHEK' => qq/Check/, + 'DCHK' => qq/Check/, + 'LECB' => qq/Phone Bill Billing/, + 'BILL' => qq/Billing/, + 'COMP' => qq/Complimentary/, + 'PREP' => qq/Prepaid Card/, + 'PREPAY' => qq/Prepaid Card/, + ); + tie my %options, 'Tie::IxHash', (); + foreach my $payby_option ( grep { exists( $payby_index{$_} ) } @paybys ) { + $options{$payby_option} = $payby_index{$payby_option}; + } + $options{$payby} = $payby_index{$payby} + unless exists($options{$payby}); + + #don't want to show multiple "Credit card" or "Check" options + my %paybyremove = ( + 'CARD' => 'DCRD', + 'DCRD' => 'CARD', + 'CHEK' => 'DCHK', + 'DCHK' => 'CHEK', + ); + delete( $options{ $paybyremove{$payby} } ); + delete $options{'DCRD'} unless $payby eq 'DCRD' || ! exists $options{'CARD'}; + delete $options{'DCHK'} unless $payby eq 'DCHK' || ! exists $options{'CHEK'}; + + HTML::Widgets::SelectLayers->new( + options => \%options, + selected_layer => $payby, +# form_name => 'dummy', +# form_action => 'dummy.cgi', + layer_callback => sub { my $layer = shift; return '<TABLE BGCOLOR="#cccccc">'.$paybychecked{$layer}.qq!<INPUT TYPE="hidden" NAME="payby" VALUE="$layer">$tail!; }, + )->html; + +%> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/change_pkg.html b/fs_selfservice/FS-SelfService/cgi/change_pkg.html new file mode 100644 index 000000000..a841308a5 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/change_pkg.html @@ -0,0 +1,37 @@ +<SCRIPT TYPE="text/javascript"> +function enable_change_pkg () { + if ( document.ChangePkgForm.pkgpart.selectedIndex > 0 ) { + document.ChangePkgForm.submit.disabled = false; + } else { + document.ChangePkgForm.submit.disabled = true; + } +} +</SCRIPT> +<FONT SIZE=4>Purchase replacement package for "<%= $pkg; %>"</FONT><BR><BR> +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} ''; %> +<FORM NAME="ChangePkgForm" ACTION="<%= $selfurl %>" METHOD=POST> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_change_pkg"> +<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%= $pkgnum %>"> +<INPUT TYPE="hidden" NAME="pkg" VALUE="<%= $pkg %>"> +<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0> +<TR> + <TD COLSPAN=2><SELECT NAME="pkgpart" onChange="enable_change_pkg()"> + <OPTION VALUE=""> + + <%= + foreach my $part_pkg ( @part_pkg ) { + $OUT .= '<OPTION VALUE="'. $part_pkg->{'pkgpart'}. '"'; + $OUT .= ' SELECTED' if $pkgpart && $part_pkg->{'pkgpart'} == $pkgpart; + $OUT .= '>'. $part_pkg->{'pkg'}; + } + %> + + </SELECT></TD> +</TR> +</TABLE> +<INPUT NAME="submit" TYPE="submit" VALUE="Purchase" disabled> +</FORM> + diff --git a/fs_selfservice/FS-SelfService/cgi/change_ship.html b/fs_selfservice/FS-SelfService/cgi/change_ship.html new file mode 100755 index 000000000..59f91767a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/change_ship.html @@ -0,0 +1,98 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Edit service address') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT><BR><BR>!; +} ''; %> + +<FORM NAME="OneTrueForm" ACTION="<%= $selfurl %>" METHOD=POST onSubmit="document.bottomform.submit.disabled=true;"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_change_ship"> +<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0> + +<%= + foreach ( + qw( last first company address1 address2 city county state zip country + daytime night fax ) + ) { + $OUT .= qq!<INPUT TYPE="hidden" NAME="$_" VALUE="${$_}">!; + }; + ''; +%> +<SCRIPT> +function bill_changed(what) { + if ( what.form.same.checked ) { +<%= + for (qw( last first company address1 address2 city zip daytime night fax )) { + $OUT .= "what.form.ship_$_.value = what.form.$_.value;"; + } + ''; +%> + what.form.ship_country.selectedIndex = what.form.country.selectedIndex; + + function fix_ship_county() { + what.form.ship_county.selectedIndex = what.form.county.selectedIndex; + } + + function fix_ship_state() { + what.form.ship_state.selectedIndex = what.form.state.selectedIndex; + ship_state_changed(what.form.ship_state, fix_ship_county ); + } + + ship_country_changed(what.form.ship_country, fix_ship_state ); + + } +} +function samechanged(what) { + if ( what.checked ) { + bill_changed(what); + +<%= + for (qw( last first company address1 address2 city county state zip country daytime night fax )) { + $OUT .= "what.form.ship_$_.disabled = true;"; + $OUT .= "what.form.ship_$_.style.backgroundColor = '#dddddd';"; + } + if ( $require_address2 ) { + $OUT .= "document.getElementById('ship_address2_required').style.visibility = 'hidden';"; + $OUT .= "document.getElementById('ship_address2_label').style.visibility = 'hidden';"; + } +%> + + } else { + +<%= + for (qw( last first company address1 address2 city county state zip country daytime night fax )) { + $OUT .= "what.form.ship_$_.disabled = false;"; + $OUT .= "what.form.ship_$_.style.backgroundColor = '#ffffff';"; + } + if ( $require_address2 ) { + $OUT .= "document.getElementById('ship_address2_required').style.visibility = '';"; + $OUT .= "document.getElementById('ship_address2_label').style.visibility = '';"; + } +%> + } +} +</SCRIPT> +(<INPUT TYPE="checkbox" NAME="same" VALUE="Y" onClick="samechanged(this)" + <%= (!$ship_last || $cgi->param('same') eq 'Y') ? 'CHECKED' : '' %> + >same as billing address) +<%= $r=qq!<font color="#ff0000">*</font> !; + if (!$ship_last || $cgi->param('same') eq 'Y') { + $disabled = 'DISABLED STYLE="background-color: #dddddd"'; + foreach ( qw( last first company address1 address2 city county state + zip country daytime night fax ) + ) { + ${"ship_$_"} = ${$_}; + } + }else{ + $disabled = ''; + } + $pre = 'ship_'; + include('contact'); +%> + +<INPUT TYPE="submit" NAME="submit" VALUE="<%= $custnum ? "Apply Changes" : "Add Customer" %>"> +<BR> +</FORM> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/check.html b/fs_selfservice/FS-SelfService/cgi/check.html new file mode 100644 index 000000000..68753fe08 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/check.html @@ -0,0 +1,54 @@ +<TR> + <TD ALIGN="right">Account type</TD> + <TD> + <SELECT NAME="paytype"> + <%= foreach ( @paytypes ) { + $selected = $paytype eq $_ ? ' SELECTED' : ''; + $OUT .= qq(<OPTION$selected VALUE="$_">$_\n); + } %> + </SELECT> + </TD> +</TD><TR> + <TD ALIGN="right">Account number</TD> + <TD><INPUT TYPE="text" NAME="payinfo1" SIZE=10 MAXLENGTH=20 VALUE="<%=$payinfo1%>"></TD> +</TD><TR> + <TD ALIGN="right">ABA/Routing number</TD> + <TD><INPUT TYPE="text" NAME="payinfo2" SIZE=10 MAXLENGTH=9 VALUE="<%=$payinfo2%>"></TD> +</TR><TR> + <TD ALIGN="right">Bank name</TD> + <TD><INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="payname" VALUE="<%=$payname%>"></TD> +</TR><TR> + <%= + $OUT = ''; + if ($show_paystate) { + $OUT .= qq!<TD ALIGN="right">Bank state</TD><TD><SELECT NAME="paystate">!; + for ( @states ) { + $OUT .= '<OPTION'. ($_ eq $paystate ? ' SELECTED' : '' ). ">$_\n"; + } + $OUT .= '</SELECT></TD></TR><TR>'; + } + %> + <%= + $OUT = ''; + if ($show_ss) { + $OUT .= '<TD ALIGN="right">Account holder<BR>Social '; + $OUT .= 'security or tax ID #</TD><TD>'; + $OUT .= qq!<INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="ss" VALUE="$ss">!; + $OUT .= '</TD></TR><TR>'; + } + %> + <%= + $OUT = ''; + if ($show_stateid) { + $OUT .= '<TD ALIGN="right">'; + $OUT .= qq!Account holder<BR>$stateid_label</TD><TD>!; + $OUT .= qq!<INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="stateid" VALUE="$stateid"></TD>!; + $OUT .= qq!<TD ALIGN="right">$stateid_state_label</TD>!; + $OUT .= '<TD><SELECT NAME="stateid_state">'; + for ( @states ) { + $OUT .= '<OPTION'. ($_ eq $stateid_state ? ' SELECTED' : '' ). ">$_\n"; + } + $OUT .='</SELECT></TD></TR><TR>'; + } + %> +</TR> diff --git a/fs_selfservice/FS-SelfService/cgi/contact.html b/fs_selfservice/FS-SelfService/cgi/contact.html new file mode 100644 index 000000000..20c15df78 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/contact.html @@ -0,0 +1,135 @@ +<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0> + +<TR> + <TH ALIGN="right"><%=$r%>Contact name<BR>(last, first)</TH> + <TD COLSPAN=5> + <INPUT TYPE="text" NAME="<%=$pre%>last" VALUE="<%= ${$pre.'last'} %>" onChange="<%= $onchange %>" <%=$disabled%>> , + <INPUT TYPE="text" NAME="<%=$pre%>first" VALUE="<%= ${$pre.'first'} %>" onChange="<%= $onchange %>" <%=$disabled%>> + </TD> +</TR> + +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=7> + <INPUT TYPE="text" NAME="<%=$pre%>company" VALUE="<%= ${$pre.'company'} %>" SIZE=70 onChange="<%= $onchange %>" <%=$disabled%>> + </TD> +</TR> + +<TR> + <TH ALIGN="right"><%=$r%>Address</TH> + <TD COLSPAN=7> + <INPUT TYPE="text" NAME="<%=$pre%>address1" VALUE="<%= ${$pre.'address1'} %>" SIZE=70 onChange="<%= $onchange %>" <%=$disabled%>> + </TD> +</TR> + +<TR> + <TD ALIGN="right"> + <%= + my $style = + ( $disabled + || !$require_address2 + || ( !$pre && $ship_last ) + ) + ? 'visibility:hidden' + : ''; + + $OUT .= qq!<FONT ID="${pre}address2_required" color="#ff0000" STYLE="$style">*</FONT> <FONT ID="${pre}address2_label" STYLE="$style"><B>Unit #</B></FONT>!; + %> + </TD> + <TD COLSPAN=7> + <INPUT TYPE="text" NAME="<%=$pre%>address2" VALUE="<%= ${$pre.'address2'} %>" SIZE=70 onChange="<%= $onchange %>" <%=$disabled%>> + </TD> +</TR> + +<TR> + <TH ALIGN="right"><%=$r%>City</TH> + <TD> + <INPUT TYPE="text" ID="<%=$pre%>city" NAME="<%=$pre%>city" VALUE="<%= ${$pre.'city'} %>" onChange="<%= $onchange %>" <%=$disabled%>> + </TD> + <%= + ($county_html, $state_html, $country_html) = + FS::SelfService::regionselector( { + prefix => $pre, + selected_county => ${$pre.'county'}, + selected_state => ${$pre.'state'}, + selected_country => ${$pre.'country'}, + default_state => $statedefault, + default_country => $countrydefault, + locales => \@cust_main_county, + } ); + + $OUT .= qq!<TH ALIGN="right">${r}State/County</TH>!; + $OUT .= qq!<TD>$county_html $state_html</TD>!; + $OUT .= qq!<TH>${r}Zip</TH>!; + $OUT .= qq!<TD><INPUT TYPE="text" NAME="${pre}zip" VALUE="${$pre.'zip'}" SIZE=10 onChange="$onchange" $disabled></TD>!; + $OUT .= qq!</TR>!; + $OUT .= qq!<TR>!; + $OUT .= qq!<TH ALIGN="right">${r}Country</TH>!; + $OUT .= qq!<TD COLSPAN=5>$country_html</TD>!; + %> +</TR> + +<SCRIPT> + <%= + if ( $disabled ) { + $OUT .= qq!var what = document.getElementById("${pre}city");!; + for (qw( county state country ) ) { + $OUT .= "what.form.$pre$_.disabled = true;"; + $OUT .= "what.form.$pre$_.style.backgroundColor = '#dddddd';"; + } + }else{ + ''; + } + %> +</SCRIPT> + +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5> + <INPUT TYPE="text" NAME="<%=$pre%>daytime" VALUE="<%= ${$pre.'daytime'} %>" SIZE=18 onChange="<%= $onchange %>" <%=$disabled%>> + </TD> +</TR> + +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5> + <INPUT TYPE="text" NAME="<%=$pre%>night" VALUE="<%= ${$pre.'night'} %>" SIZE=18 onChange="<%= $onchange %>" <%=$disabled%>> + </TD> +</TR> + +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5> + <INPUT TYPE="text" NAME="<%=$pre%>fax" VALUE="<%= ${$pre.'fax'} %>" SIZE=12 onChange="<%= $onchange %>" <%=$disabled%>> + </TD> +</TR> + +</TABLE> +<%=$r%>required fields<BR> + +<!-- +#my($county_html, $state_html, $country_html) = +# FS::cust_main_county::regionselector( $cust_main->get($pre.'county'), +# $cust_main->get($pre.'state'), +# $cust_main->get($pre.'country'), +# $pre, +# $onchange, +# $disabled, +# ); + +my %select_hash = ( + 'county' => ${$pre.'county'}, + 'state' => ${$pre.'state'}, + 'country' => ${$pre.'country'}, + 'prefix' => $pre, + 'onchange' => $onchange, + 'disabled' => $disabled, +); + +my @counties = counties( ${$pre.'state'}, + ${$pre.'country'}, + ); +my $county_style = scalar(@counties) > 1 ? '' : 'STYLE="visibility:hidden"'; + +my $r = qq!<font color="#ff0000">*</font> !; +--> diff --git a/fs_selfservice/FS-SelfService/cgi/cust_bill-logo.cgi b/fs_selfservice/FS-SelfService/cgi/cust_bill-logo.cgi new file mode 100644 index 000000000..253f853f8 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/cust_bill-logo.cgi @@ -0,0 +1,25 @@ +#!/usr/bin/perl -T +#!/usr/bin/perl -Tw + +use strict; +use CGI; +use FS::SelfService qw( invoice_logo ); + +my $cgi = new CGI; + +my %hash = (); +if ( $cgi->param('invnum') ) { + $hash{$_} = scalar($cgi->param($_)) foreach qw( invnum template ); +} else { + my($query) = $cgi->keywords; + $query =~ /^([^\.\/]*)$/ or '' =~ /^()$/; + $hash{'template'} = $1; +} + +my $hashref = invoice_logo(%hash); + +print $cgi->header( '-type' => $hashref->{'content_type'}, + '-expires' => 'now', + ). + $hashref->{'logo'}; + diff --git a/fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html b/fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html new file mode 100644 index 000000000..37dccaaf2 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/customer_change_pkg.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Change package') %> + +<%= include('change_pkg') %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html b/fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html new file mode 100755 index 000000000..192c29fa4 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/customer_order_pkg.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Purchase additional package') %> + +<%= include('order_pkg') %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/cvv2.html b/fs_selfservice/FS-SelfService/cgi/cvv2.html new file mode 100644 index 000000000..b178c8513 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/cvv2.html @@ -0,0 +1,25 @@ +<HTML> + <HEAD> + <TITLE> + CVV2 information + </TITLE> + </HEAD> + <BODY BGCOLOR="#e8e8e8"> + The CVV2 number (also called CVC2 or CID) is a three- or four-digit + security code used to reduce credit card fraud.<BR><BR> + <TABLE BORDER=0 CELLSPACING=4> + <TR> + <TH>Visa / MasterCard / Discover</TH> + <TH>American Express</TH> + </TR> + <TR> + <TD> + <IMG BORDER=0 ALT="Visa/MasterCard/Discover" SRC="cvv2.png"> + </TD> + <TD> + <IMG BORDER=0 ALT="American Express" SRC="cvv2_amex.png"> + </TD> + </TABLE> + <CENTER><A HREF="javascript:close()">(close window)</A></CENTER> + </BODY> +</HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/cvv2.png b/fs_selfservice/FS-SelfService/cgi/cvv2.png Binary files differnew file mode 100644 index 000000000..4610dcbe6 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/cvv2.png diff --git a/fs_selfservice/FS-SelfService/cgi/cvv2_amex.png b/fs_selfservice/FS-SelfService/cgi/cvv2_amex.png Binary files differnew file mode 100644 index 000000000..21c36a0ab --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/cvv2_amex.png diff --git a/fs_selfservice/FS-SelfService/cgi/decline.html b/fs_selfservice/FS-SelfService/cgi/decline.html new file mode 100644 index 000000000..c50081e38 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/decline.html @@ -0,0 +1,14 @@ +<HTML> + <HEAD> + <TITLE>Processing error</TITLE> + <%= $head %> + </HEAD> + <BODY BGCOLOR="<%= $body_bgcolor || '#eeeeee' %>"> + <%= $body_header %> + + +<FONT SIZE=7>Processing error</FONT><BR><BR> +There has been an error processing your account. Please contact customer +support. + +<%= $body_footer %> diff --git a/fs_selfservice/FS-SelfService/cgi/delete_svc.html b/fs_selfservice/FS-SelfService/cgi/delete_svc.html new file mode 100644 index 000000000..80a14f85c --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/delete_svc.html @@ -0,0 +1,11 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Remove service') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT>!; +} else { + $OUT .= "<FONT SIZE=4>$svc removed.</FONT>"; +} %> + + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/discount_term.html b/fs_selfservice/FS-SelfService/cgi/discount_term.html new file mode 100644 index 000000000..7d9ee4d1f --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/discount_term.html @@ -0,0 +1,17 @@ +<%= +if ( scalar(keys %discount_terms_hash) ) { + $OUT .= '<TR>'; + $OUT .= '<TD ALIGN="right">Prepayment for</TD>'; + $OUT .= '<TD>'; + $OUT .= '<SELECT NAME="discount_term">'; + $OUT .= qq(<OPTION VALUE="">1 month\n); + foreach ( keys %discount_terms_hash ) { + $selected = $discount_term eq $_ ? ' SELECTED' : ''; + $OUT .= qq(<OPTION$selected VALUE="$_">$_ months\n); + } + $OUT .= '</SELECT>'; + $OUT .= '</TD>'; + $OUT .= '</TR>'; +} +$OUT .= ''; +%> diff --git a/fs_selfservice/FS-SelfService/cgi/footer.html b/fs_selfservice/FS-SelfService/cgi/footer.html new file mode 100644 index 000000000..4889b741a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/footer.html @@ -0,0 +1,3 @@ +</TD></TR></TABLE> +<%= $body_footer %> +</BODY></HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/header.html b/fs_selfservice/FS-SelfService/cgi/header.html new file mode 100644 index 000000000..984030dee --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/header.html @@ -0,0 +1,75 @@ +<HTML> + <HEAD> + <TITLE><%= $title || 'MyAccount' %></TITLE> + <%= $head %> + </HEAD> + <STYLE TYPE="text/css"> + body { + color: <%= $text_color || '#000000' %>; + <%= $font ? "font: $font;" : '' %> + } + a { + color: <%= $link_color || 'blue' %>; + <%= $menu_nounderline ? 'text-decoration: none' : '' %> + } + a:visited { + color: <%= $vlink_color || 'purple' %>; + <%= $menu_nounderline ? 'text-decoration: none' : '' %> + } + a:active { + color: <%= $alink_color || 'blue' %>; + <%= $menu_nounderline ? 'text-decoration: none' : '' %> + } + a:hover { + color: <%= $hlink_color || '' %>; + <%= $menu_nounderline ? 'text-decoration: none' : '' %> + } + + .svctable { + border: 1px solid black; + padding: 0; + border-spacing: 0; + background-color: <%= $box_bgcolor ||= '#c0c0c0' %> + } + + .svctable td, .svctable th { + border-bottom: 1px solid black; + padding: 4px; + } + + </STYLE> + <BODY BGCOLOR="<%= $body_bgcolor || '#eeeeee' %>"> + <script language="JavaScript"><!-- + var mywindow = -1; + function myopen(filename,windowname,properties) { + myclose(); + mywindow = window.open(filename,windowname,properties); + } + function myclose() { + if ( mywindow != -1 ) + mywindow.close(); + mywindow = -1 + } + //--></script> + <%= $body_header %> + + <TABLE BORDER=0 WIDTH="100%" CELLPADDING=0 CELLSPACING=0> + <TR STYLE="padding:0px"> + <TD><IMG SRC="image.cgi?logo"></TD> + <TD WIDTH = "29%" + STYLE = "background: url(image.cgi?title_left_image) no-repeat left center; padding:0px"> + </TD> + <TD WIDTH = "49%" + ALIGN="<%= $title_align || 'left' %>" + STYLE = "background: url(image.cgi?title_right_image) no-repeat right center; padding:0px"> + <FONT SIZE = "<%= $title_size || 5 %>" + COLOR = "<%= $title_color %>" + ><%= $INCLUDE_ARGS[0] %> </FONT> + </DIV> + </TD> + </TR> + </TABLE> + + <%= include('myaccount_menu') %> + <TD VALIGN="top"> + diff --git a/fs_selfservice/FS-SelfService/cgi/iframecontentmws.js b/fs_selfservice/FS-SelfService/cgi/iframecontentmws.js new file mode 100644 index 000000000..f2a91d21b --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/iframecontentmws.js @@ -0,0 +1,59 @@ +/*
+ iframecontentmws.js - Foteos Macrides (author and copyright holder)
+ Initial: October 10, 2004 - Last Revised: January 26, 2008
+ Scripts for using HTML documents as iframe content in overlibmws popups.
+
+ See http://www.macridesweb.com/oltest/IFRAME.html
+ and http://www.macridesweb.com/oltest/AJAX.html#ajaxex3
+ for more information.
+*/
+
+/*
+ Use as lead argument in overlib or overlb2 calls. Include WRAP and
+ TEXTPADDING,0 in the call to ensure that the width arg is respected (unless
+ the CAPTION plus CLOSETEXT widths add up to more than the width arg, in which
+ case you should increase the width arg). The name arg should be a unique
+ string for each popup with iframe content in the document. The frameborder
+ arg should be 1 (browser default if omitted) or 0. The scrolling arg should
+ be 'auto' (default if omitted), 'yes' or 'no'.
+*/
+function OLiframeContent(src, width, height, name, frameborder, scrolling) {
+
+ /* stupid safari iframe location caching... */
+ var d = new Date();
+ var unique = d.getTime() + '' + Math.floor(1000 * Math.random());
+ name = name + '' + unique;
+
+ return ('<iframe src="'+src+'" width="'+width+'" height="'+height+'"'
+ +(name!=null?' name="'+name+'" id="'+name+'"':'')
+ +(frameborder!=null?' frameborder="'+frameborder+'"':'')
+ +' scrolling="'+(scrolling!=null?scrolling:'auto')
+ +'"><div>[iframe not supported]</div></iframe>');
+}
+
+/*
+ Swap the src if we are iframe content. The name arg should be the same
+ string as in the OLiframeContent function for the popup. The src arg is
+ a partial, relative, or complete URL for the document to be swapped in.
+*/
+function OLswapIframeSrc(name, src){
+ if(parent==self){
+ alert(src+'\n\n is only for iframe content');
+ return;
+ }
+ var o=parent.OLgetRef(name);
+ if(o)o.src=src;
+ else alert(src+'\n\n is not available');
+}
+
+/*
+ Emulate the Back button if we are iframe content. Use only in documents
+ which are swapped in by using the OLswapIframeSrc function.
+*/
+function OLiframeBack(){
+ if(parent==self){
+ alert('This feature is only for iframe content');
+ return;
+ }
+ history.back();
+}
diff --git a/fs_selfservice/FS-SelfService/cgi/image.cgi b/fs_selfservice/FS-SelfService/cgi/image.cgi new file mode 100755 index 000000000..e951dcd1a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/image.cgi @@ -0,0 +1,20 @@ +#!/usr/bin/perl -T +#!/usr/bin/perl -Tw + +use strict; +use CGI; +use FS::SelfService qw( skin_info ); + +my $cgi = new CGI; + +my($query) = $cgi->keywords; +$query =~ /^(\w+)$/ or '' =~ /^()$/; +my $name = $1; + +my $info = skin_info(); + +print $cgi->header( '-type' => 'image/png', #for now + #'-expires' => 'now', + ). + $info->{$name}; + diff --git a/fs_selfservice/FS-SelfService/cgi/images/cross.png b/fs_selfservice/FS-SelfService/cgi/images/cross.png Binary files differnew file mode 100644 index 000000000..1514d51a3 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/images/cross.png diff --git a/fs_selfservice/FS-SelfService/cgi/images/wait-orange.gif b/fs_selfservice/FS-SelfService/cgi/images/wait-orange.gif Binary files differnew file mode 100644 index 000000000..92c7f3476 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/images/wait-orange.gif diff --git a/fs_selfservice/FS-SelfService/cgi/invoices.html b/fs_selfservice/FS-SelfService/cgi/invoices.html new file mode 100644 index 000000000..c4eece32a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/invoices.html @@ -0,0 +1,27 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'All Invoices') %> + +<%= + if ( @invoices ) { + $OUT .= '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#eeeeee">'. + '<TR><TH BGCOLOR="#ff6666" COLSPAN=4>All Invoices</TH></TR>'; + my $col1 = "ffffff"; + my $col2 = "dddddd"; + my $col = $col1; + + foreach my $invoice ( @invoices ) { + my $td = qq!<TD BGCOLOR="#$col">!; + my $a=qq!<A HREF="${url}view_invoice;invnum=!. $invoice->{'invnum'}. '">'; + $OUT .= + "<TR>$td${a}Invoice #". $invoice->{'invnum'}. "</A></TD>$td</TD>". + "$td$a". $invoice->{'date'}. "</A></TD>$td</TD>". + '</TR>'; + $col = $col eq $col1 ? $col2 : $col1; + } + $OUT .= '</TABLE><BR>'; + } else { + $OUT .= 'You have no invoices.<BR><BR>'; + } +%> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/list_customers.html b/fs_selfservice/FS-SelfService/cgi/list_customers.html new file mode 100644 index 000000000..7fe7fa493 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/list_customers.html @@ -0,0 +1,36 @@ +<HTML><HEAD><TITLE>Reseller</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_menu') %> +<TD VALIGN="top"> + +<%= + if ( @customers ) { + $OUT .= '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#eeeeee">'. + '<TR><TH BGCOLOR="#cccccc" COLSPAN=3>Customers</TH><TD>'; + my $col1 = "ffffff"; + my $col2 = "dddddd"; + my $col = $col1; + + foreach my $customer ( @customers ) { + my $td = qq!<TD BGCOLOR="#$col">!; + my $a = qq!<A HREF="${url}view_customer;custnum=!. + $customer->{'custnum'}. '">'; + $OUT .= + '<TR>'. + "$td<FONT COLOR=\"". $customer->{'statuscolor'}. '">'. + ucfirst($customer->{'status'}). "</TD>". "$td</TD>". + "$td$a". $customer->{'name'}. "</A></TD>". + '</TR>'; + #"$td</TD>". + $col = $col eq $col1 ? $col2 : $col1; + } + $OUT .= '</TABLE>'; + } else { + $OUT .= 'No customers.<BR><BR>'; + } +%> + +</TD></TR></TABLE> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/login.html b/fs_selfservice/FS-SelfService/cgi/login.html new file mode 100644 index 000000000..f7473b1d5 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/login.html @@ -0,0 +1,95 @@ +<HTML> + <HEAD> + <TITLE>Login</TITLE> + <%= $head %> + </HEAD> + <BODY BGCOLOR="<%= $body_bgcolor || '#eeeeee' %>"> + <%= $body_header %> + +<FONT SIZE=5>Login</FONT><BR><BR> +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> + +<FORM ACTION="<%= $self_url %>" METHOD=POST> +<INPUT TYPE="hidden" NAME="session" VALUE="login"> +<INPUT TYPE="hidden" NAME="agentnum" VALUE="<%= $agentnum %>"> + +<TABLE BGCOLOR="<%= $box_bgcolor || '#c0c0c0' %>" BORDER=0 CELLSPACING=2 CELLPADDING=0> + +<TR> + <TH ALIGN="right">Username </TH> + <TD> + <INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"><%= $single_domain ? '@'.$single_domain : '' %> + </TD> +</TR> + +<%= +if ( $single_domain ) { + + $OUT .= qq(<INPUT TYPE="hidden" NAME="domain" VALUE="$single_domain">); + +} else { + + $OUT .= qq( + <TR> + <TH ALIGN="right">Domain </TH> + <TD> + <INPUT TYPE="text" NAME="domain" VALUE="$domain"> + </TD> + </TR> + ); + +} + +%> + +<TR> + <TH ALIGN="right">Password </TH> + <TD> + <INPUT TYPE="password" NAME="password"> + </TD> +</TR> +<TR> + <TD COLSPAN=2 ALIGN="center"><INPUT TYPE="submit" VALUE="Login"></TD> +</TR> +</TABLE> +</FORM> + +<%= + +if ( $phone_login ) { + + $box_bgcolor ||= '#c0c0c0'; + + $OUT .= qq( + + <B>OR</B><BR><BR> + + <FORM ACTION="$self_url" METHOD=POST> + <INPUT TYPE="hidden" NAME="session" VALUE="login"> + <TABLE BGCOLOR="$box_bgcolor" BORDER=0 CELLSPACING=2 CELLPADDING=0> + <TR> + <TH ALIGN="right">Phone number </TH> + <TD> + <INPUT TYPE="text" NAME="username" VALUE="$username"> + </TD> + </TR> + <INPUT TYPE="hidden" NAME="domain" VALUE="svc_phone"> + <TR> + <TH ALIGN="right">PIN </TH> + <TD> + <INPUT TYPE="password" NAME="password"> + </TD> + </TR> + <TR> + <TD COLSPAN=2 ALIGN="center"><INPUT TYPE="submit" VALUE="Login"></TD> + </TR> + </TABLE> + </FORM> + + ); + +} + +%> + +<%= $body_footer %> diff --git a/fs_selfservice/FS-SelfService/cgi/logout.html b/fs_selfservice/FS-SelfService/cgi/logout.html new file mode 100644 index 000000000..5e22ad80c --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/logout.html @@ -0,0 +1,13 @@ +<HTML> + <HEAD> + <TITLE>MyAccount</TITLE> + <%= $head %> + </HEAD> + <BODY BGCOLOR="<%= $body_bgcolor || '#eeeeee' %>"> + <%= $body_header %> + + <FONT SIZE=5>MyAccount</FONT><BR><BR> +You have been logged out. + +<%= $body_footer %> + diff --git a/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html b/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html new file mode 100644 index 000000000..5b81b00a4 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html @@ -0,0 +1,43 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Make a payment') %> + +<FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>"> +<INPUT TYPE="hidden" NAME="action" VALUE="ach_payment_results"> +<TABLE BGCOLOR="#cccccc"> +<TR> + <TD ALIGN="right">Amount Due</TD> + <TD> + <TABLE><TR><TD BGCOLOR="#ffffff"> + $<%=sprintf("%.2f",$balance)%> + </TD></TR></TABLE> + </TD> +</TR> +<TR> + <TD ALIGN="right">Payment amount</TD> + <TD> + <TABLE><TR><TD BGCOLOR="#ffffff"> + $<INPUT TYPE="text" NAME="amount" SIZE=8 VALUE="<%=sprintf("%.2f",$balance)%>"> + </TD></TR></TABLE> + </TD> +</TR> +<%= include('discount_term') %> +<%= include('check') %> +<TR> + <TD COLSPAN=2> + <INPUT TYPE="checkbox" <%= $save_unchecked ? '' : 'CHECKED' %> NAME="save" VALUE="1"> + Remember this information + </TD> +</TR><TR> + <TD COLSPAN=2> + <INPUT TYPE="checkbox"<%= $payby eq 'CHEK' ? ' CHECKED' : '' %> NAME="auto" VALUE="1" onClick="if (this.checked) { document.OneTrueForm.save.checked=true; }"> + Charge future payments to this account automatically + </TD> +</TR> +</TABLE> +<BR> +<INPUT TYPE="hidden" NAME="paybatch" VALUE="<%=$paybatch%>"> +<INPUT TYPE="submit" NAME="process" VALUE="Process payment"> <!-- onClick="this.disabled=true"> --> +</FORM> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/make_payment.html b/fs_selfservice/FS-SelfService/cgi/make_payment.html new file mode 100644 index 000000000..3bce67433 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/make_payment.html @@ -0,0 +1,60 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Make a payment') %> + +<FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>"> +<INPUT TYPE="hidden" NAME="action" VALUE="payment_results"> +<TABLE BGCOLOR="#cccccc"> +<TR> + <TH ALIGN="right">Amount Due</TH> + <TD COLSPAN=7> + <TABLE><TR><TD BGCOLOR="#ffffff"> + $<%=sprintf("%.2f",$balance)%> + </TD></TR></TABLE> + </TD> +</TR> +<TR> + <TH ALIGN="right">Payment amount</TH> + <TD COLSPAN=7> + <TABLE><TR><TD BGCOLOR="#ffffff"> +<%= + $amt = $balance; + $amt += $amt * $credit_card_surcharge_percentage/100 + if $credit_card_surcharge_percentage > 0; + ''; +%> + $<INPUT TYPE="text" NAME="amount" SIZE=8 VALUE="<%=sprintf("%.2f",$amt)%>"> + </TD></TR></TABLE> + </TD> +</TR> +<%= include('discount_term') %> +<TR> + <TH ALIGN="right">Card type</TH> + <TD COLSPAN=7> + <SELECT NAME="card_type"><OPTION></OPTION> + <%= foreach ( keys %card_types ) { + $selected = $card_type eq $card_types{$_} ? ' SELECTED' : ''; + $OUT .= qq(<OPTION$selected VALUE="). $card_types{$_}. qq(">$_\n); + } %> + </SELECT> + </TD> +</TR> +<%= include('card') %> +<TR> + <TD COLSPAN=8> + <INPUT TYPE="checkbox" <%= $save_unchecked ? '' : 'CHECKED' %> NAME="save" VALUE="1"> + Remember this card and billing address + </TD> +</TR><TR> + <TD COLSPAN=8> + <INPUT TYPE="checkbox"<%= $payby eq 'CARD' ? ' CHECKED' : '' %> NAME="auto" VALUE="1" onClick="if (this.checked) { document.OneTrueForm.save.checked=true; }"> + Charge future payments to this card automatically + </TD> +</TR> +</TABLE> +<BR> +<INPUT TYPE="hidden" NAME="paybatch" VALUE="<%=$paybatch%>"> +<INPUT TYPE="submit" NAME="process" VALUE="Process payment"> <!-- onClick="this.disabled=true"> --> +</FORM> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html b/fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html new file mode 100755 index 000000000..b5b9eea1f --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/make_thirdparty_payment.html @@ -0,0 +1,36 @@ +<%= $url = "$selfurl?session=$session_id;action="; + $cgi = new CGI; + ''; %> +<%= include('header', 'Make a payment') %> + +<FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" +onSubmit="document.OneTrueForm.process.disabled=true"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>"> +<INPUT TYPE="hidden" NAME="action" VALUE="post_thirdparty_payment"> +<INPUT TYPE="hidden" NAME="payby_method" VALUE="<%= +$cgi->param('payby_method') =~ /(CC|ECHECK)/; +$1 %>"> +<TABLE BGCOLOR="#cccccc"> +<TR> + <TH ALIGN="right">Balance due</TH> + <TD COLSPAN=7> + <SPAN STYLE="background-color: #ffffff;">$<%=sprintf("%.2f", $balance)%> + </TD> +</TR> +<TR> + <TH ALIGN="right">Payment amount</TH> + <TD COLSPAN=7> + $<INPUT TYPE="text" NAME="amount" SIZE=8 VALUE="<%=sprintf("%.2f", $balance)%>"> + </TD> +</TR> +<TR><TH></TH> +<TD><INPUT TYPE="submit" NAME="process" VALUE="Process payment"> +</FORM> + +<SCRIPT TYPE="text/javascript" SRC="overlibmws.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="overlibmws_iframe.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="overlibmws_draggable.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="overlibmws_crossframe.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="iframecontentmws.js"></SCRIPT> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/map.gif b/fs_selfservice/FS-SelfService/cgi/map.gif Binary files differnew file mode 100644 index 000000000..ef884d8f9 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/map.gif diff --git a/fs_selfservice/FS-SelfService/cgi/misc/areacodes.cgi b/fs_selfservice/FS-SelfService/cgi/misc/areacodes.cgi new file mode 100755 index 000000000..b33e58c5a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/misc/areacodes.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use strict; +use CGI; +use FS::SelfService qw( mason_comp ); + +my $cgi = new CGI; + +my $rv = mason_comp( 'comp' => '/misc/areacodes.cgi', + 'query_string' => $cgi->query_string, #pass CGI params... + ); + +#hmm. +my $output = $rv->{'error'} || $rv->{'output'}; + +print $cgi->header( '-expires' => 'now' ). + $output; + diff --git a/fs_selfservice/FS-SelfService/cgi/misc/counties.cgi b/fs_selfservice/FS-SelfService/cgi/misc/counties.cgi new file mode 100755 index 000000000..476fe09a4 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/misc/counties.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use strict; +use CGI; +use FS::SelfService qw( mason_comp ); + +my $cgi = new CGI; + +my $rv = mason_comp( 'comp' => '/misc/counties.cgi', + 'query_string' => $cgi->query_string, #pass CGI params... + ); + +#hmm. +my $output = $rv->{'error'} || $rv->{'output'}; + +print $cgi->header( '-expires' => 'now' ). + $output; + diff --git a/fs_selfservice/FS-SelfService/cgi/misc/exchanges.cgi b/fs_selfservice/FS-SelfService/cgi/misc/exchanges.cgi new file mode 100755 index 000000000..d8df970d9 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/misc/exchanges.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use strict; +use CGI; +use FS::SelfService qw( mason_comp ); + +my $cgi = new CGI; + +my $rv = mason_comp( 'comp' => '/misc/exchanges.cgi', + 'query_string' => $cgi->query_string, #pass CGI params... + ); + +#hmm. +my $output = $rv->{'error'} || $rv->{'output'}; + +print $cgi->header( '-expires' => 'now' ). + $output; + diff --git a/fs_selfservice/FS-SelfService/cgi/misc/part_svc-columns.cgi b/fs_selfservice/FS-SelfService/cgi/misc/part_svc-columns.cgi new file mode 100755 index 000000000..4ee83ca96 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/misc/part_svc-columns.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use strict; +use CGI; +use FS::SelfService qw( mason_comp ); + +my $cgi = new CGI; + +my $rv = mason_comp( 'comp' => '/misc/part_svc-columns.cgi', + 'query_string' => $cgi->query_string, #pass CGI params... + ); + +#hmm. +my $output = $rv->{'error'} || $rv->{'output'}; + +print $cgi->header( '-expires' => 'now' ). + $output; + diff --git a/fs_selfservice/FS-SelfService/cgi/misc/phonenums.cgi b/fs_selfservice/FS-SelfService/cgi/misc/phonenums.cgi new file mode 100755 index 000000000..e7d695d07 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/misc/phonenums.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use strict; +use CGI; +use FS::SelfService qw( mason_comp ); + +my $cgi = new CGI; + +my $rv = mason_comp( 'comp' => '/misc/phonenums.cgi', + 'query_string' => $cgi->query_string, #pass CGI params... + ); + +#hmm. +my $output = $rv->{'error'} || $rv->{'output'}; + +print $cgi->header( '-expires' => 'now' ). + $output; + diff --git a/fs_selfservice/FS-SelfService/cgi/misc/states.cgi b/fs_selfservice/FS-SelfService/cgi/misc/states.cgi new file mode 100755 index 000000000..f75f2ae1d --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/misc/states.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use strict; +use CGI; +use FS::SelfService qw( mason_comp ); + +my $cgi = new CGI; + +my $rv = mason_comp( 'comp' => '/misc/states.cgi', + 'query_string' => $cgi->query_string, #pass CGI params... + ); + +#hmm. +my $output = $rv->{'error'} || $rv->{'output'}; + +print $cgi->header( '-expires' => 'now' ). + $output; + diff --git a/fs_selfservice/FS-SelfService/cgi/misc/svc_acct-domains.cgi b/fs_selfservice/FS-SelfService/cgi/misc/svc_acct-domains.cgi new file mode 100755 index 000000000..c5413bac6 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/misc/svc_acct-domains.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use strict; +use CGI; +use FS::SelfService qw( mason_comp ); + +my $cgi = new CGI; + +my $rv = mason_comp( 'comp' => '/misc/svc_acct-domains.cgi', + 'query_string' => $cgi->query_string, #pass CGI params... + ); + +#hmm. +my $output = $rv->{'error'} || $rv->{'output'}; + +print $cgi->header( '-expires' => 'now' ). + $output; + diff --git a/fs_selfservice/FS-SelfService/cgi/myaccount.html b/fs_selfservice/FS-SelfService/cgi/myaccount.html new file mode 100644 index 000000000..a57bfb14a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/myaccount.html @@ -0,0 +1,114 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'My Account') %> + +Hello <%= $name %>!<BR><BR> +<%= $small_custview %> +<BR> +<%= if ( $access_pkgnum ) { + $OUT .= qq!Balance: <B>\$$balance</B><BR><BR>!; + } + ''; +%> + +<%= + $OUT .= qq! <B><A HREF="${url}invoices">View All Invoices</A></B> !; +%> + +<%= if ( $balance > 0 ) { + if (scalar(grep $_, @hide_payment_fields)) { + $OUT .= qq! <B><A HREF="${url}make_thirdparty_payment&payby_method=CC">Make a payment</A></B><BR><BR>!; + } else { + $OUT .= qq! <B><A HREF="${url}make_payment">Make a payment</A></B><BR>!; + foreach my $term ( sort { $b <=> $a } keys %discount_terms_hash ) { + my $saved = $discount_terms_hash{$term}->[1]; + my $amount = $discount_terms_hash{$term}->[2]; + my $savings = ( $amount + $saved > 0 ) + ? sprintf('%d', $saved / ( $amount + $saved ) * 100 ) : '0'; + $OUT .= qq! <B><A HREF="${url}make_term_payment;discount_term=$term;amount=$amount">Save $savings\% by paying for $term months: $amount</A></B><BR>!; + } + $OUT .= qq! <BR>!; + } +} %> +<%= + if ( @open_invoices ) { + $OUT .= '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#eeeeee">'. + '<TR><TH BGCOLOR="#ff6666" COLSPAN=5>Open Invoices</TH></TR>'; + my $link = qq!<A HREF="<%= $url %>myaccount!; + my $col1 = "ffffff"; + my $col2 = "dddddd"; + my $col = $col1; + + foreach my $invoice ( @open_invoices ) { + my $td = qq!<TD BGCOLOR="#$col">!; + my $a=qq!<A HREF="${url}view_invoice;invnum=!. $invoice->{'invnum'}. '">'; + $OUT .= + "<TR>$td${a}Invoice #". $invoice->{'invnum'}. "</A></TD>$td</TD>". + "$td$a". $invoice->{'date'}. "</A></TD>$td</TD>". + qq!<TD BGCOLOR="#$col" ALIGN="right">$a\$!. $invoice->{'owed'}. + '</A></TD>'. + '</TR>'; + $col = $col eq $col1 ? $col2 : $col1; + } + $OUT .= '</TABLE><BR>'; + } else { + $OUT .= 'You have no outstanding invoices.<BR><BR>'; + } +%> + +<%= + if ( @support_services ) { + $OUT .= '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#eeeeee">'. + '<TR><TH BGCOLOR="#ff6666" COLSPAN="3">Support Time Remaining</TH>'. + '</TR><TR><TH ALIGN="left">#</TH><TH>Package</TH>'. + '<TH>Time Remaining</TH></TR>'; + my $col1 = "ffffff"; + my $col2 = "dddddd"; + my $col = $col1; + + foreach my $support ( @support_services ) { + my $td = qq!<TD BGCOLOR="#$col">!; + my $a = qq!<A HREF="${url}view_support_details;svcnum=!. + $support->{'svcnum'}. '">'; + $OUT .= + "<TR>$td$a". $support->{'pkgnum'}. "</A></TD>". + $td.$a. $support->{'pkg'}. "</A></TD>". + $td.$a. $support->{'time'}. "</A></TD>". + '</TR>'; + $col = $col eq $col1 ? $col2 : $col1; + } + $OUT .= '</TABLE><BR>'; + } else { + $OUT .= ''; + } +%> + +<%= + if ( @tickets ) { + $OUT .= '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#eeeeee">'. + '<TR><TH BGCOLOR="#ff6666" COLSPAN=6>Open Tickets</TH></TR>'. + '<TR><TH>#</TH><TH>Subject</TH><TH>Priority</TH><TH>Queue</TH>'. + '<TH>Status</TH><TH>Created</TH></TR>'; + my $col1 = "ffffff"; + my $col2 = "dddddd"; + my $col = $col1; + + foreach my $ticket ( @tickets ) { + my $td = qq!<TD BGCOLOR="#$col">!; + my $link = qq!<A HREF="${url}tktview;ticket_id=$ticket->{id}">!; + $OUT .= + "<TR>$td $link". $ticket->{'id'}. "</A></TD>". + $td. $ticket->{'subject'}. "</TD>". + $td. ($ticket->{'content'} || $ticket->{'priority'}). "</TD>". + $td. $ticket->{'queue'}. "</TD>". + $td. $ticket->{'status'}. "</TD>". + $td. $ticket->{'created'}. "</TD>". + '</TR>'; + $col = $col eq $col1 ? $col2 : $col1; + } + $OUT .= '</TABLE>'; + } else { + $OUT .= ''; + } +%> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html new file mode 100644 index 000000000..4036432aa --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html @@ -0,0 +1,154 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<TABLE BORDER=0><TR> +<TD VALIGN="top" BGCOLOR="<%= $menu_bgcolor || $box_bgcolor || '#c0c0c0' %>"> + +<TABLE CELLSPACING=0 BORDER=0 HEIGHT="100%"> + +<%= + +if ( $menu_top_image ) { + $OUT .= '<TR><TD STYLE="padding:0px"><IMG SRC="image.cgi?menu_top_image"></TD></TR>'; +} + +my @menu = ( + { title=>' ' }, + { title=>'Overview', url=>'myaccount', size=>'+1', }, + { title=>' ' }, + { title=>'Purchase', size=>'+1', }, +); + +unless ( $access_pkgnum ) { + push @menu, + { title=>'Purchase additional package', + url=>'customer_order_pkg', 'indent'=>2 }; +} + +if ( 1 ) { #XXXFIXME "enable selfservice prepay features" flag or something, eventually per-pkg or something really fancy + + #XXXFIXME still a bit sloppy for multi-gateway of differing namespace + my $i = 0; + while($i < scalar(@cust_paybys)) { last if $cust_paybys[$i] =~ /^CARD/; $i++ } + if ( $cust_paybys[$i] && $cust_paybys[$i] =~ /^CARD/ ) { + push @menu, { title => 'Recharge my account with a credit card', + url => $hide_payment_fields[$i] + ? 'make_thirdparty_payment&payby_method=CC' + : 'make_payment', + indent => 2, + } + } + + $i = 0; + while($i < scalar(@cust_paybys)) { last if $cust_paybys[$i] =~ /^CHEK/; $i++ } + if ( $cust_paybys[$i] && $cust_paybys[$i] =~ /^CHEK/ ) { + push @menu, { title => 'Recharge my account with a check', + url => $hide_payment_fields[$i] + ? 'make_thirdparty_payment&payby_method=ECHECK' + : 'make_ach_payment', + indent => 2, + } + } + + push @menu, { title => 'Recharge my account with a prepaid card', + url => 'recharge_prepay', + indent => 2, + } + if grep(/^PREP/, @cust_paybys); + +} + +push @menu, + { title=>' ' }, + { title=>'View my usage', url=>'view_usage', size=>'+1', }, + { title=>'Create a ticket', url=>'tktcreate', size=>'+1', }, +; + +unless ( $access_pkgnum ) { + push @menu, + { title=>'Setup my services', url=>'provision', size=>'+1', }, + ; +} + +push @menu, + { title=>' ' }; + +push @menu, + { title=>'Change my information', size=>'+1', }; + +unless ( $access_pkgnum ) { + push @menu, + { title=>'Change billing address', url=>'change_bill', indent=>2 }, + { title=>'Change service address', url=>'change_ship', indent=>2 }, + { title=>'Change payment information', url=>'change_pay', indent=>2 }, + ; +} + +push @menu, + { title=>'Change password(s)', url=>'change_password', indent=>2 }, + { title=>' ' }, + { title=>'Logout', url=>'logout', size=>'+1', }, +; + +foreach my $item ( @menu ) { + + next if $menu_skipblanks && $item->{'title'} =~ /^\s*$/; + next if $menu_skipheadings && ! $item->{'url'}; + + $OUT .= '<TR><TD'; + if ( $menu_body_image ) { + if ( exists $item->{'url'} && $action eq $item->{'url'} ) { + $OUT .= #' BGCOLOR="'. ( $body_bgcolor || '#eeeeee' ). '" '. + ' STYLE="background: url(image.cgi?menu_body_image) 0 bottom; '. + ' color:#3366CC"; '. #XXX config + ' " '; + } else { + $OUT .= ' STYLE="background: url(image.cgi?menu_body_image) 0 bottom" '; + } + } else { + if ( exists $item->{'url'} && $action eq $item->{'url'} ) { + $OUT .= ' BGCOLOR="'. ( $body_bgcolor || '#eeeeee' ). '" '. + ' STYLE="border-top: 1px solid black;'. + ' border-left: 1px solid black;'. + ' border-bottom: 1px solid black"'; + } else { + $OUT .= ' STYLE="border-right: 1px solid black"'; + } + } + $OUT.='>'; + + if ( $menu_skipheadings ) { + $OUT .= ' '; + } else { + $OUT .= ' ' x $item->{'indent'} + if exists $item->{'indent'}; + } + + $OUT .= '<A HREF="'. $url. $item->{'url'}. '">' + if exists $item->{'url'} && $action ne $item->{'url'}; + + $OUT .= '<FONT SIZE="'. ( $menu_fontsize || $item->{'size'} ). '">' + if $menu_fontsize || exists($item->{'size'}); + + $item->{'title'} =~ s/ / /g; + $OUT .= $item->{'title'}; + + $OUT .= '</FONT>' + if exists $item->{'size'}; + + $OUT .= '</A>' + if exists $item->{'url'} && $action ne $item->{'url'}; + + $OUT .= '</TD></TR>'; + +} + +if ( $menu_bottom_image ) { + $OUT .= '<TR><TD STYLE="padding:0px"><IMG SRC="image.cgi?menu_bottom_image"></TD></TR>'; +} else { + $OUT .= '<TR><TD STYLE="border-right: 1px solid black" HEIGHT="100%"><BR><BR><BR><BR></TD></TR>'; +} + +%> + +</TABLE> + +</TD> diff --git a/fs_selfservice/FS-SelfService/cgi/order_pkg.html b/fs_selfservice/FS-SelfService/cgi/order_pkg.html new file mode 100644 index 000000000..79335a0c2 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/order_pkg.html @@ -0,0 +1,47 @@ +<SCRIPT TYPE="text/javascript"> +function enable_order_pkg () { + if ( document.OrderPkgForm.pkgpart_svcpart.selectedIndex > 0 ) { + document.OrderPkgForm.submit.disabled = false; + } else { + document.OrderPkgForm.submit.disabled = true; + } +} +</SCRIPT> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} ''; %> +<FORM NAME="OrderPkgForm" ACTION="<%= $selfurl %>" METHOD=POST> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_order_pkg"> +<INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>"> +<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0> + +<TR> + <TD COLSPAN=2> + <TABLE><TR><TD> <%= $pkg_selector %> + + </TD> +</TR> + +<%= + if ( 0 ) { + if ( @svc_acct_pop ) { + $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector( 'popnum' => $popnum, + 'pops' => \@svc_acct_pop, + 'init_popstate' => $init_popstate, + 'popac' => $popac, + 'acstate' => $acstate, + ). + '</TD></TR>'; + } else { + $OUT .= popselector(popnum=>$popnum, pops=>\@svc_acct_pop); + } + } + ''; +%> +</TABLE> +<INPUT NAME="submit" TYPE="submit" VALUE="Purchase" DISABLED> +</FORM> + diff --git a/fs_selfservice/FS-SelfService/cgi/overlibmws.js b/fs_selfservice/FS-SelfService/cgi/overlibmws.js new file mode 100644 index 000000000..df2bd1db7 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/overlibmws.js @@ -0,0 +1,620 @@ +/*
+ Do not remove or change this notice.
+ overlibmws.js core module - Copyright Foteos Macrides 2002-2008. All rights reserved.
+ Initial: August 18, 2002 - Last Revised: March 22, 2008
+ This module is subject to the same terms of usage as for Erik Bosrup's overLIB,
+ though only a minority of the code and API now correspond with Erik's version.
+ See the overlibmws Change History and Command Reference via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+ Give credit on sites that use overlibmws and submit changes so others can use them as well.
+ You can get Erik's version via: http://www.bosrup.com/web/overlib/
+*/
+
+// PRE-INIT -- Ignore these lines, configuration is below.
+var OLloaded=0,OLbubblePI=0,OLcrossframePI=0,OLdebugPI=0,OLdraggablePI=0,OLexclusivePI=0,OLfilterPI=0,
+OLfunctionPI=0,OLhidePI=0,OLiframePI=0,OLmodalPI=0,OLovertwoPI=0,OLscrollPI=0,OLshadowPI=0,OLprintPI=0,
+pmCnt=1,pMtr=new Array(),OLcmdLine=new Array(),OLrunTime=new Array(),OLv,OLudf,OLrefXY,
+OLpct=new Array("83%","67%","83%","100%","117%","150%","200%","267%");if(typeof OLgateOK=='undefined')var OLgateOK=1;
+var OLp1or2c='inarray,caparray,caption,closetext,right,left,center,autostatuscap,padx,pady,below,above,vcenter,donothing',
+OLp1or2co='nofollow,background,offsetx,offsety,fgcolor,bgcolor,cgcolor,textcolor,capcolor,width,wrap,wrapmax,height,border,'
++'base,status,autostatus,snapx,snapy,fixx,fixy,relx,rely,midx,midy,ref,refc,refp,refx,refy,fgbackground,bgbackground,'
++'cgbackground,fullhtml,capicon,textfont,captionfont,textsize,captionsize,timeout,delay,hauto,vauto,nojustx,nojusty,fgclass,'
++'bgclass,cgclass,capbelow,textpadding,textfontclass,captionpadding,captionfontclass,sticky,noclose,mouseoff,offdelay,'
++'closecolor,closefont,closesize,closeclick,closetitle,closefontclass,decode',OLp1or2o='text,cap,close,hpos,vpos,padxl,'
++'padxr,padyt,padyb',OLp1co='label',OLp1or2=OLp1or2co+','+OLp1or2o,OLp1=OLp1co+','+'frame';
+OLregCmds(OLp1or2c+','+OLp1or2co+','+OLp1co);
+function OLud(v){return eval('typeof ol_'+v+'=="undefined"')?1:0;}
+
+// DEFAULT CONFIGURATION -- See overlibConfig.txt for descriptions
+if(OLud('fgcolor'))var ol_fgcolor="#ccccff";
+if(OLud('bgcolor'))var ol_bgcolor="#333399";
+if(OLud('cgcolor'))var ol_cgcolor="#333399";
+if(OLud('textcolor'))var ol_textcolor="#000000";
+if(OLud('capcolor'))var ol_capcolor="#ffffff";
+if(OLud('closecolor'))var ol_closecolor="#eeeeff";
+if(OLud('textfont'))var ol_textfont="Verdana,Arial,Helvetica";
+if(OLud('captionfont'))var ol_captionfont="Verdana,Arial,Helvetica";
+if(OLud('closefont'))var ol_closefont="Verdana,Arial,Helvetica";
+if(OLud('textsize'))var ol_textsize=1;
+if(OLud('captionsize'))var ol_captionsize=1;
+if(OLud('closesize'))var ol_closesize=1;
+if(OLud('fgclass'))var ol_fgclass="";
+if(OLud('bgclass'))var ol_bgclass="";
+if(OLud('cgclass'))var ol_cgclass="";
+if(OLud('textpadding'))var ol_textpadding=2;
+if(OLud('textfontclass'))var ol_textfontclass="";
+if(OLud('captionpadding'))var ol_captionpadding=2;
+if(OLud('captionfontclass'))var ol_captionfontclass="";
+if(OLud('closefontclass'))var ol_closefontclass="";
+if(OLud('close'))var ol_close="Close";
+if(OLud('closeclick'))var ol_closeclick=0;
+if(OLud('closetitle'))var ol_closetitle="Click to Close";
+if(OLud('text'))var ol_text="Default Text";
+if(OLud('cap'))var ol_cap="";
+if(OLud('capbelow'))var ol_capbelow=0;
+if(OLud('background'))var ol_background="";
+if(OLud('width'))var ol_width=200;
+if(OLud('wrap'))var ol_wrap=0;
+if(OLud('wrapmax'))var ol_wrapmax=0;
+if(OLud('height'))var ol_height= -1;
+if(OLud('border'))var ol_border=1;
+if(OLud('base'))var ol_base=0;
+if(OLud('offsetx'))var ol_offsetx=10;
+if(OLud('offsety'))var ol_offsety=10;
+if(OLud('sticky'))var ol_sticky=0;
+if(OLud('nofollow'))var ol_nofollow=0;
+if(OLud('noclose'))var ol_noclose=0;
+if(OLud('mouseoff'))var ol_mouseoff=0;
+if(OLud('offdelay'))var ol_offdelay=300;
+if(OLud('hpos'))var ol_hpos=RIGHT;
+if(OLud('vpos'))var ol_vpos=BELOW;
+if(OLud('status'))var ol_status="";
+if(OLud('autostatus'))var ol_autostatus=0;
+if(OLud('snapx'))var ol_snapx=0;
+if(OLud('snapy'))var ol_snapy=0;
+if(OLud('fixx'))var ol_fixx= -1;
+if(OLud('fixy'))var ol_fixy= -1;
+if(OLud('relx'))var ol_relx=null;
+if(OLud('rely'))var ol_rely=null;
+if(OLud('midx'))var ol_midx=null;
+if(OLud('midy'))var ol_midy=null;
+if(OLud('ref'))var ol_ref="";
+if(OLud('refc'))var ol_refc='UL';
+if(OLud('refp'))var ol_refp='UL';
+if(OLud('refx'))var ol_refx=0;
+if(OLud('refy'))var ol_refy=0;
+if(OLud('fgbackground'))var ol_fgbackground="";
+if(OLud('bgbackground'))var ol_bgbackground="";
+if(OLud('cgbackground'))var ol_cgbackground="";
+if(OLud('padxl'))var ol_padxl=1;
+if(OLud('padxr'))var ol_padxr=1;
+if(OLud('padyt'))var ol_padyt=1;
+if(OLud('padyb'))var ol_padyb=1;
+if(OLud('fullhtml'))var ol_fullhtml=0;
+if(OLud('capicon'))var ol_capicon="";
+if(OLud('frame'))var ol_frame=self;
+if(OLud('timeout'))var ol_timeout=0;
+if(OLud('delay'))var ol_delay=0;
+if(OLud('hauto'))var ol_hauto=0;
+if(OLud('vauto'))var ol_vauto=0;
+if(OLud('nojustx'))var ol_nojustx=0;
+if(OLud('nojusty'))var ol_nojusty=0;
+if(OLud('label'))var ol_label="";
+if(OLud('decode'))var ol_decode=0;
+// ARRAY CONFIGURATION - See overlibConfig.txt for descriptions.
+if(OLud('texts'))var ol_texts=new Array("Text 0","Text 1");
+if(OLud('caps'))var ol_caps=new Array("Caption 0","Caption 1");
+// END CONFIGURATION -- Don't change anything below, all configuration is above.
+
+// INIT -- Runtime variables.
+var o3_text="",o3_cap="",o3_sticky=0,o3_nofollow=0,o3_background="",o3_noclose=0,o3_mouseoff=0,o3_offdelay=300,o3_hpos=RIGHT,
+o3_offsetx=10,o3_offsety=10,o3_fgcolor="",o3_bgcolor="",o3_cgcolor="",o3_textcolor="",o3_capcolor="",o3_closecolor="",
+o3_width=200,o3_wrap=0,o3_wrapmax=0,o3_height= -1,o3_border=1,o3_base=0,o3_status="",o3_autostatus=0,o3_snapx=0,o3_snapy=0,
+o3_fixx= -1,o3_fixy= -1,o3_relx=null,o3_rely=null,o3_midx=null,o3_midy=null,o3_ref="",o3_refc='UL',o3_refp='UL',o3_refx=0,
+o3_refy=0,o3_fgbackground="",o3_bgbackground="",o3_cgbackground="",o3_padxl=0,o3_padxr=0,o3_padyt=0,o3_padyb=0,o3_fullhtml=0,
+o3_vpos=BELOW,o3_capicon="",o3_textfont="Verdana,Arial,Helvetica",o3_captionfont="",o3_closefont="",o3_textsize=1,OLcC=null,
+o3_captionsize=1,o3_closesize=1,o3_frame=self,o3_timeout=0,o3_delay=0,o3_hauto=0,o3_vauto=0,o3_nojustx=0,o3_nojusty=0,
+o3_close="",o3_closeclick=0,o3_closetitle="",o3_fgclass="",o3_bgclass="",o3_cgclass="",o3_textpadding=2,o3_textfontclass="",
+o3_captionpadding=2,o3_captionfontclass="",o3_closefontclass="",o3_capbelow=0,o3_label="",o3_decode=0,
+CSSOFF=DONOTHING,CSSCLASS=DONOTHING,over=null,OLdelayid=0,OLtimerid=0,OLshowid=0,OLndt=0,OLfnRef="",OLhover=0,OLx=0,OLy=0,
+OLshowingsticky=0,OLallowmove=0,OLoverHTML="",OLover2HTML="",OLifRef="",OLo2Ref="",OLifX=0,OLifY=0,
+OLua=(OLv=navigator.userAgent)?OLv.toLowerCase():'',
+OLns4=(navigator.appName=='Netscape'&&parseInt(navigator.appVersion)==4)?1:0,
+OLns6=(document.getElementById)?1:0,
+OLie4=(document.all)?1:0,
+OLgek=(OLv=OLua.match(/gecko\/(\d{8})/i))?parseInt(OLv[1]):0,
+OLmac=(OLua.indexOf('mac')>=0)?1:0,
+OLsaf=(OLua.indexOf('safari')>=0)?1:0,
+OLkon=(OLua.indexOf('konqueror')>=0)?1:0,
+OLkht=(OLsaf||OLkon)?1:0,
+OLopr=(OLua.indexOf('opera')>=0)?1:0,
+OLop7=(OLopr&&document.createTextNode)?1:0;
+if(OLopr){OLns4=OLns6=OLgek=0;OLie4=(OLop7)?1:0;}
+var OLieM=((OLie4&&OLmac)&&!(OLkht||OLopr))?1:0,
+OLie5=0,OLie55=0;OLie7=0;if(OLie4&&!OLop7){
+if((OLv=OLua.match(/msie (\d\.\d+)\.*/i))&&(OLv=parseFloat(OLv[1]))>=5.0){
+OLie5=1;OLns6=0;if(OLv>=5.5)OLie55=1;if(OLv>=7.0)OLie7=1;}if(OLns6)OLie4=0;}
+if(OLns4)window.onresize=function(){location.reload();};var OLchkMh=1,OLdw;
+if(OLns4||OLie4||OLns6){OLmh();if(window.addEventListener)window.addEventListener("unload",
+OLulCl,false);}else{overlib=nd=cClick=OLpageDefaults=no_overlib;}
+function OLulCl(){if(over)cClick();window.removeEventListener("unload",OLulCl,false);}
+
+/*
+ PUBLIC FUNCTIONS
+*/
+// Loads defaults then args into runtime variables.
+function overlib(){
+if(!(OLloaded&&OLgateOK))return;if((OLexclusivePI)&&OLisExclusive(arguments))return true;if(OLchkMh)OLmh();
+if(OLndt&&!OLtimerid)OLndt=0;if(over)cClick();if(parent!=self){if(parent.OLo2Ref){parent.OLeval(parent.OLo2Ref);
+parent.OLo2Ref="";}if(parent.OLifRef){parent.OLeval(parent.OLifRef);parent.OLifRef="";}}if(OLo2Ref){eval(OLo2Ref);
+OLo2Ref="";}if(OLifRef){eval(OLifRef);OLifRef="";}OLload(OLp1or2);OLload(OLp1);OLfnRef="";OLifX=0;OLifY=0;OLhover=0;
+OLsetRunTimeVar();OLparseTokens('o3_',arguments);if(!(over=OLmkLyr()))return false;if(o3_decode)OLdecode();if(OLprintPI)
+OLchkPrint();if(OLbubblePI)OLchkForBubbleEffect();if(OLdebugPI)OLsetDebugCanShow();if(OLshadowPI)OLinitShadow();
+if(OLiframePI)OLinitIfs();if(OLfilterPI)OLinitFilterLyr();if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")
+o3_status=o3_exclusivestatus;else if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;else if(o3_autostatus==1&&o3_text!="")
+o3_status=o3_text;if(!o3_delay){return OLmain();}else{OLdelayid=setTimeout("OLmain()",o3_delay);if(o3_status!=""){
+self.status=o3_status;return true;}else if(!(OLop7&&event&&event.type=='mouseover'))return false;}
+}
+function OLeval(s){eval(s);}
+
+// Clears popups if appropriate
+function nd(time){
+if(OLloaded&&OLgateOK){if(!((OLexclusivePI)&&OLisExclusive())){if(time&&over&&!o3_delay){
+if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=(OLhover&&o3_frame==self&&!OLcursorOff())?0:
+setTimeout("cClick()",(o3_timeout=OLndt=time));}else{if(!OLshowingsticky){OLallowmove=0;
+if(over)OLhideObject(over);}}}}return false;
+}
+
+// Close function for stickies
+function cClick(){
+if(OLloaded&&OLgateOK){OLhover=0;if(over){if(OLo2Ref){eval(OLo2Ref);OLo2Ref="";}if(OLovertwoPI&&over==over2)cClick2();
+OLhideObject(over);OLshowingsticky=0;OLallowmove=0;}if(OLmodalPI)OLclearModal();}return false;
+}
+
+// Sets page-specific defaults.
+function OLpageDefaults(){
+OLparseTokens('ol_',arguments);
+}
+
+// Gets object referenced by its id or name
+function OLgetRef(l,d){var r=OLgetRefById(l,d);return (r)?r:OLgetRefByName(l,d);}
+
+// For unsupported browsers.
+function no_overlib(){return false;}
+
+/*
+ OVERLIB MAIN FUNCTION SET
+*/
+function OLmain(){
+o3_delay=0;if(parent!=self&&o3_frame==parent&&parent.OLscrollPI&&parent.over)parent.OLclearScroll();if(o3_frame==self){
+if(o3_noclose)OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);}if(o3_sticky){OLshowingsticky=1;if(OLfnRef&&
+parent!=self&&o3_frame==parent&&parent.overlib){parent.OLifRef=OLfnRef+'cClick()';}}OLdoLyr();OLallowmove=0;if(o3_timeout>0){
+if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}OLchkRef();OLdisp(o3_status);
+if(OLdraggablePI)OLcheckDrag();if(o3_status!="")return true;else if(!(OLop7&&event&&event.type=='mouseover'))return false;
+}
+function OLchkRef(){
+if(o3_ref){OLrefXY=OLgetRefXY(o3_ref);if(OLrefXY[0]==null&&OLcrossframePI)OLchkIfRef();
+if(OLrefXY[0]==null){o3_ref="";o3_midx=0;o3_midy=0;}}
+}
+
+// Loads o3_ variables
+function OLload(c){var i,m=c.split(',');for(i=0;i<m.length;i++)eval('o3_'+m[i]+'=ol_'+m[i]);}
+
+// Chooses LGF
+function OLdoLGF(){
+return (o3_background!=''||o3_fullhtml)?OLcontentBackground(o3_text,o3_background,o3_fullhtml):(o3_cap=="")?
+OLcontentSimple(o3_text):(o3_sticky)?OLcontentCaption(o3_text,o3_cap,o3_close):OLcontentCaption(o3_text,o3_cap,'');
+}
+
+// Makes Layer
+function OLmkLyr(id,f,z){
+id=(id||'overDiv');f=(f||o3_frame);z=(z||1000);var fd=f.document,d=OLgetRefById(id,fd);
+if(!d){if(OLns4)d=fd.layers[id]=new Layer(1024,f);else if(OLie4&&!OLop7){
+fd.body.insertAdjacentHTML('AfterBegin','<div id="'+id+'"></div>');d=fd.all[id];}else{d=fd.createElement('div');
+if(d){d.id=id;fd.body.appendChild(d);}}if(!d)return null;if(OLns4)d.zIndex=z;else{var o=d.style;o.position='absolute';
+o.visibility='hidden';o.zIndex=z;}}return d;
+}
+
+// Creates and writes layer content
+function OLdoLyr(){
+if(o3_sticky&&OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}if(o3_background==''&&!o3_fullhtml){
+if(o3_fgbackground!='')o3_fgbackground=' background="'+o3_fgbackground+'"';
+if(o3_bgbackground!='')o3_bgbackground=' background="'+o3_bgbackground+'"';
+if(o3_cgbackground!='')o3_cgbackground=' background="'+o3_cgbackground+'"';
+if(o3_fgcolor!='')o3_fgcolor=' bgcolor="'+o3_fgcolor+'"';if(o3_bgcolor!='')o3_bgcolor=' bgcolor="'+o3_bgcolor+'"';
+if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';if(o3_height>0)o3_height=' height="'+o3_height+'"';
+else o3_height='';}if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();
+if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);if(OLie4){
+var w=OLfd().clientWidth;if(o3_width>=w){if(OLop7){if(OLovertwoPI&&over==over2){var z=over2.style.zIndex;
+o3_frame.document.body.removeChild(over);over2=OLmkLyr('overDiv2',o3_frame,z);over=over2;}else{
+o3_frame.document.body.removeChild(over);over=OLmkLyr();}}o3_width=w-20;}}
+if(o3_wrapmax<1&&o3_frame.innerWidth)o3_wrapmax=o3_frame.innerWidth-40;
+if(o3_wrapmax>0&&o3_width>o3_wrapmax)o3_width=o3_wrapmax;o3_wrap=0;lyrHtml=OLdoLGF();}OLlayerWrite(lyrHtml);
+o3_width=(OLns4?over.clip.width:over.offsetWidth);if(OLbubblePI)OLgenerateBubble(lyrHtml);
+}
+
+/*
+ LAYER GENERATION FUNCTIONS
+*/
+// Makes simple table without caption
+function OLcontentSimple(txt){
+var t=OLbgLGF()+OLfgLGF(txt)+OLbaseLGF();OLsetBackground('');return t;
+}
+
+// Makes table with caption and optional close link
+function OLcontentCaption(txt,title,close){
+var closing=(OLprintPI?OLprintCapLGF():''),closeevent='onmouseover',caption,t,cC='javascript:return '+OLfnRef
++(OLovertwoPI&&over==over2?'cClick2();':'cClick();');if(o3_closeclick)closeevent=(o3_closetitle?'title="'
++o3_closetitle+'" ':'')+'onclick';if(o3_capicon!=''&&o3_capicon.indexOf('<img')!=0)o3_capicon='<img src="'+o3_capicon
++'" /> ';if(close){closing+='<td align="right"><a href="'+cC+'" '+closeevent+'="'+cC+'"'+(o3_closefontclass?' class="'
++o3_closefontclass+'">':(OLns4?'><':'')+OLlgfUtil(0,1,'','a',o3_closecolor,o3_closefont,o3_closesize))+close+
+(o3_closefontclass?'':(OLns4?OLlgfUtil(1,1,'','a'):''))+'</a></td>';}caption='<table id="overCap'
++(OLovertwoPI&&over==over2?'2':'')+'"'+OLwd(0)+' border="0" cellpadding="'+o3_captionpadding+'" cellspacing="0"'
++(o3_cgclass?' class="'+o3_cgclass+'"':o3_cgcolor+o3_cgbackground)+'><tr><td'+OLwd(0)+(o3_cgclass?' class="'
++o3_cgclass+'">':'>')+(o3_captionfontclass?'<div'+OLhL(1)+' class="'+o3_captionfontclass+'">':OLlgfUtil(0,1,'','div',
+o3_capcolor,o3_captionfont,o3_captionsize))+o3_capicon+title+OLlgfUtil(1,1,'','div')+'</td>'+closing+'</tr></table>';
+t=OLbgLGF()+(o3_capbelow?OLfgLGF(txt)+caption:caption+OLfgLGF(txt))+OLbaseLGF();OLsetBackground('');return t;
+}
+
+// For BACKGROUND and FULLHTML commands
+function OLcontentBackground(txt,image,hasfullhtml){
+var t;if(hasfullhtml){t=txt;}else{t='<table'+OLwd(1)+' border="0" cellpadding="0" '+'cellspacing="0" '+'height="'
++o3_height+'"><tr><td colspan="3" height="'+o3_padyt+'"></td></tr><tr><td width="'+o3_padxl+'"></td><td valign="top"'
++OLwd(2)+'>'+OLlgfUtil(0,0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+txt+OLlgfUtil(1,0,'','div')
++'</td><td width="'+o3_padxr+'"></td></tr><tr><td colspan="3" height="'+o3_padyb+'"></td></tr></table>';}
+OLsetBackground(image);return t;
+}
+
+// LGF utilities
+function OLbgLGF(){
+return '<table'+OLwd(1)+o3_height+' border="0" cellpadding="'+o3_border+'" cellspacing="0"'+(o3_bgclass?' class="'
++o3_bgclass+'"':o3_bgcolor+o3_bgbackground)+'><tr><td>';
+}
+function OLfgLGF(t){
+return '<table'+OLwd(0)+o3_height+' border="0" cellpadding="'+o3_textpadding+'" cellspacing="0"'+(o3_fgclass?' class="'
++o3_fgclass+'"':o3_fgcolor+o3_fgbackground)+'><tr><td valign="top"'+(o3_fgclass?' class="'+o3_fgclass+'"':'')+'>'
++OLlgfUtil(0,0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+t+(OLprintPI?OLprintFgLGF():'')
++OLlgfUtil(1,0,'','div')+'</td></tr></table>';
+}
+function OLlgfUtil(end,stg,tfc,ele,col,fac,siz){
+if(end)return('</'+(OLns4?'font'+(stg?'></strong':''):ele)+'>');else return(tfc?'<div'+OLhL(1)+' class="'+tfc+'">':
+((ele=='a'?'':'<')+(OLns4?(stg?'strong><':'')+'font color="'+col+'" face="'+OLquoteMultiNameFonts(fac)+'" size="'
++siz:(ele=='a'?'':ele)+' style="'+((ele=='div')?OLhL(0):'')+'color:'+col+(stg?';font-weight:bold':'')+';font-family:'
++OLquoteMultiNameFonts(fac)+';font-size:'+siz+';'+(ele=='span'?'text-decoration:underline;':''))+'">'));
+}
+function OLquoteMultiNameFonts(f){
+var i,v,pM=f.split(',');for(i=0;i<pM.length;i++){v=pM[i];v=v.replace(/^\s+/,'').replace(/\s+$/,'');
+if(/\s/.test(v) && !/['"]/.test(v)){v="\'"+v+"\'";pM[i]=v;}}return pM.join();
+}
+function OLbaseLGF(){
+return ((o3_base>0&&!o3_wrap)?('<table width="100%" border="0" cellpadding="0" cellspacing="0"'+(o3_bgclass?' class="'
++o3_bgclass+'"':'')+'><tr><td height="'+o3_base+'"></td></tr></table>'):'')+'</td></tr></table>';
+}
+function OLwd(a){return(o3_wrap?'':' width="'+(!a?'100%':(a==1?o3_width:(o3_width-o3_padxl-o3_padxr)))+'"');}
+function OLhL(s){return(s?' style="width:100%;"':'width:100%;');}
+
+// Loads image into the div.
+function OLsetBackground(i){
+if(i==''){if(OLns4)over.background.src=null;else{if(OLns6)over.style.width='';over.style.backgroundImage='none';}}
+else{if(OLns4)over.background.src=i;else{if(OLns6)over.style.width=o3_width+'px';over.style.backgroundImage='url('+i+')';}}
+}
+
+/*
+ HANDLING FUNCTIONS
+*/
+// Displays layer
+function OLdisp(s){
+if(OLmodalPI&&!o3_modalscroll)OLchkModal();if(!OLallowmove){if(OLshadowPI)OLdispShadow();if(OLiframePI)OLdispIfs();
+OLplaceLayer();if(OLmodalPI&&o3_modalscroll)OLchkModal();if(OLndt)OLshowObject(over);
+else OLshowid=setTimeout("OLshowObject(over)",1);OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;
+}
+
+// Decides placement of layer.
+function OLplaceLayer(){
+var snp,X,Y,pgLeft,pgTop,pWd=o3_width,pHt,iWd=100,iHt=100,SB=0,LM=0,CX=0,TM=0,BM=0,CY=0,o=OLfd(),
+nsb=(OLgek>=20010505&&!o3_frame.scrollbars.visible)?1:0;
+if(!OLkht&&o&&o.clientWidth)iWd=o.clientWidth;
+else if(o3_frame.innerWidth){SB=Math.ceil(1.4*(o3_frame.outerWidth-o3_frame.innerWidth));
+if(SB>20)SB=20;iWd=o3_frame.innerWidth;}
+pgLeft=(OLie4)?o.scrollLeft:o3_frame.pageXOffset;
+if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)SB=CX=5;else
+if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){SB+=((o3_shadowx>0)?o3_shadowx:0);
+LM=((o3_shadowx<0)?Math.abs(o3_shadowx):0);CX=Math.abs(o3_shadowx);}
+if(o3_ref!=""||o3_fixx> -1||o3_relx!=null||o3_midx!=null){
+if(o3_ref!=""){X=OLrefXY[0];if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow){
+if(o3_refp=='UR'||o3_refp=='LR')X-=5;}
+else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){
+if(o3_shadowx<0&&(o3_refp=='UL'||o3_refp=='LL'))X-=o3_shadowx;else
+if(o3_shadowx>0&&(o3_refp=='UR'||o3_refp=='LR'))X-=o3_shadowx;}
+}else{if(o3_midx!=null){
+X=parseInt(pgLeft+((iWd-pWd-SB-LM)/2)+o3_midx);
+}else{if(o3_relx!=null){
+if(o3_relx>=0)X=pgLeft+o3_relx+LM;else X=pgLeft+o3_relx+iWd-pWd-SB;
+}else{X=o3_fixx+LM;}}}
+}else{
+if(o3_hauto){
+if(o3_hpos==LEFT&&OLx-pgLeft+OLifX<iWd/2&&OLx-pWd-o3_offsetx+OLifX<pgLeft+LM)o3_hpos=RIGHT;else
+if(o3_hpos==RIGHT&&OLx-pgLeft+OLifX>iWd/2&&OLx+pWd+o3_offsetx+OLifX>pgLeft+iWd-SB)o3_hpos=LEFT;}
+X=(o3_hpos==CENTER)?parseInt(OLx-((pWd+CX)/2)+o3_offsetx):
+(o3_hpos==LEFT)?OLx-o3_offsetx-pWd:OLx+o3_offsetx;
+if(o3_snapx>1){
+snp=X % o3_snapx;
+if(o3_hpos==LEFT){X=X-(o3_snapx+snp);}else{X=X+(o3_snapx-snp);}}X+=OLifX;}
+if(!o3_nojustx&&X+pWd>pgLeft+iWd-SB)
+X=iWd+pgLeft-pWd-SB;if(!o3_nojustx&&X-LM<pgLeft)X=pgLeft+LM;
+pgTop=OLie4?o.scrollTop:o3_frame.pageYOffset;
+if(!OLkht&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;
+else if(o3_frame.innerHeight)iHt=o3_frame.innerHeight;
+if(OLbubblePI&&o3_bubble)pHt=OLbubbleHt;else pHt=OLns4?over.clip.height:over.offsetHeight;
+if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){TM=(o3_shadowy<0)?Math.abs(o3_shadowy):0;
+if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)BM=CY=5;else
+BM=(o3_shadowy>0)?o3_shadowy:0;CY=Math.abs(o3_shadowy);}
+if(o3_ref!=""||o3_fixy> -1||o3_rely!=null||o3_midy!=null){
+if(o3_ref!=""){Y=OLrefXY[1];if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow){
+if(o3_refp=='LL'||o3_refp=='LR')Y-=5;}else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){
+if(o3_shadowy<0&&(o3_refp=='UL'||o3_refp=='UR'))Y-=o3_shadowy;else
+if(o3_shadowy>0&&(o3_refp=='LL'||o3_refp=='LR'))Y-=o3_shadowy;}
+}else{if(o3_midy!=null){
+Y=parseInt(pgTop+((iHt-pHt-CY)/2)+o3_midy);
+}else{if(o3_rely!=null){
+if(o3_rely>=0)Y=pgTop+o3_rely+TM;else Y=pgTop+o3_rely+iHt-pHt-BM;}else{
+Y=o3_fixy+TM;}}}
+}else{
+if(o3_vauto){
+if(o3_vpos==ABOVE&&OLy-pgTop+OLifY<iHt/2&&OLy-pHt-o3_offsety+OLifY<pgTop)o3_vpos=BELOW;else
+if(o3_vpos==BELOW&&OLy-pgTop+OLifY>iHt/2&&OLy+pHt+o3_offsety+((OLns4||OLkht)?17:0)+OLifY>pgTop+iHt-BM)
+o3_vpos=ABOVE;}Y=(o3_vpos==VCENTER)?parseInt(OLy-((pHt+CY)/2)+o3_offsety):
+(o3_vpos==ABOVE)?OLy-(pHt+o3_offsety+BM):OLy+o3_offsety+TM;
+if(o3_snapy>1){
+snp=Y % o3_snapy;
+if(pHt>0&&o3_vpos==ABOVE){Y=Y-(o3_snapy+snp);}else{Y=Y+(o3_snapy-snp);}}Y+=OLifY;}
+if(!o3_nojusty&&Y+pHt+BM>pgTop+iHt)Y=pgTop+iHt-pHt-BM;if(!o3_nojusty&&Y-TM<pgTop)Y=pgTop+TM;
+OLrepositionTo(over,X,Y);
+if(OLshadowPI)OLrepositionShadow(X,Y);if(OLiframePI)OLrepositionIfs(X,Y);
+if(OLns6&&o3_frame.innerHeight){iHt=o3_frame.innerHeight;OLrepositionTo(over,X,Y);}
+if(OLscrollPI)OLchkScroll(X-pgLeft,Y-pgTop);
+}
+
+// Chooses body or documentElement
+function OLfd(f){
+var fd=((f)?f:o3_frame).document,fdc=fd.compatMode,fdd=fd.documentElement;
+return (!OLop7&&fdc&&fdc!='BackCompat'&&fdd&&fdd.clientWidth)?fd.documentElement:fd.body;
+}
+
+// Gets location of REFerence object
+function OLgetRefXY(r,d){
+var o=OLgetRef(r,d),ob=o,rXY=[o3_refx,o3_refy],of;if(!o)return [null,null];if(OLns4){
+if(typeof o.length!='undefined'&&o.length>1){ob=o[0];rXY[0]+=o[0].x+o[1].pageX;rXY[1]+=o[0].y+o[1].pageY;}else{
+if((o.toString().indexOf('Image')!= -1)||(o.toString().indexOf('Anchor')!= -1)){rXY[0]+=o.x;rXY[1]+=o.y;}
+else{rXY[0]+=o.pageX;rXY[1]+=o.pageY;}}}else{rXY[0]+=OLpageLoc(o,'Left');rXY[1]+=OLpageLoc(o,'Top');}
+of=OLgetRefOffsets(ob);rXY[0]+=of[0];rXY[1]+=of[1];return rXY;
+}
+
+// Seeks REFerence by id
+function OLgetRefById(l,d){
+l=(l||'overDiv');d=(d||o3_frame.document);var j,r;if(d.getElementById)return d.getElementById(l);
+if(OLie4&&d.all)return d.all[l];if(d.layers&&d.layers.length>0){if(d.layers[l])return d.layers[l];
+for(j=0;j<d.layers.length;j++){r=OLgetRefById(l,d.layers[j].document);if(r)return r;}}return null;
+}
+
+// Seeks REFerence by name
+function OLgetRefByName(l,d){
+d=(d||o3_frame.document);var j,r,v=OLie4?d.all.tags('iframe'):OLns6?d.getElementsByTagName('iframe'):null;
+if(typeof d.images!='undefined'&&d.images[l])return d.images[l];
+if(typeof d.anchors!='undefined'&&d.anchors[l])return d.anchors[l];
+if(v)for(j=0;j<v.length;j++)if(v[j].name==l)return v[j];if(d.layers&&d.layers.length>0)for(j=0;j<d.layers.length;j++){
+r=OLgetRefByName(l,d.layers[j].document);if(r&&r.length>0)return r;else if(r)return [r,d.layers[j]];}return null;
+}
+
+// Gets layer vs REFerence offsets
+function OLgetRefOffsets(o){
+var c=o3_refc.toUpperCase(),p=o3_refp.toUpperCase(),W=0,H=0,pW=0,pH=0,of=[0,0];pW=(OLbubblePI&&o3_bubble)?
+o3_width:OLns4?over.clip.width:over.offsetWidth;pH=(OLbubblePI&&o3_bubble)?OLbubbleHt:OLns4?
+over.clip.height:over.offsetHeight;if((!OLop7)&&o.toString().indexOf('Image')!= -1){W=o.width;H=o.height;}
+else if((!OLop7)&&o.toString().indexOf('Anchor')!= -1){c=o3_refc='UL';}else{W=(OLns4)?o.clip.width:o.offsetWidth;
+H=(OLns4)?o.clip.height:o.offsetHeight;}if((OLns4||(OLns6&&OLgek))&&o.border){W+=2*parseInt(o.border);
+H+=2*parseInt(o.border);}if(c=='UL'){of=(p=='UR')?[-pW,0]:(p=='LL')?[0,-pH]:(p=='LR')?[-pW,-pH]:[0,0];}else if(c=='UR'){
+of=(p=='UR')?[W-pW,0]:(p=='LL')?[W,-pH]:(p=='LR')?[W-pW,-pH]:[W,0];}else if(c=='LL'){of=(p=='UR')?[-pW,H]:(p=='LL')?[0,H-pH]:
+(p=='LR')?[-pW,H-pH]:[0,H];}else if(c=='LR'){of=(p=='UR')?[W-pW,H]:(p=='LL')?[W,H-pH]:(p=='LR')?[W-pW,H-pH]:[W,H];}return of;
+}
+
+// Gets x or y location of object
+function OLpageLoc(o,t){
+var l=0,s=o;while(o.offsetParent&&o.offsetParent.tagName.toLowerCase()!='html'){l+=o['offset'+t];o=o.offsetParent;}
+l+=o['offset'+t];while(s=s.parentNode){if((s['scroll'+t]>0)&&s.tagName.toLowerCase()=='div')l-=s['scroll'+t];}return l;
+}
+
+// Moves layer
+function OLmouseMove(e){
+var e=(e||event);OLcC=(OLovertwoPI&&over2&&over==over2?cClick2:cClick);OLx=(e.pageX||e.clientX+OLfd().scrollLeft);
+OLy=(e.pageY||e.clientY+OLfd().scrollTop);if((OLallowmove&&over)&&(o3_frame==self||over==OLgetRefById()||(OLovertwoPI&&
+over2==over&&over==OLgetRefById('overDiv2')))){OLplaceLayer();if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}if(OLhover&&over&&
+o3_frame==self&&OLcursorOff())if(o3_offdelay<1)OLcC();else{if(OLtimerid>0)clearTimeout(OLtimerid);
+OLtimerid=setTimeout("OLcC()",o3_offdelay);}
+}
+
+// Capture mouse and chain other scripts.
+function OLmh(){
+var fN,f,j,k,s,mh=OLmouseMove,w=(OLns4&&window.onmousemove),re=/function[ ]*(\w*)\(/;OLdw=document;if(document.onmousemove||
+w){if(w)OLdw=window;f=OLdw.onmousemove.toString();fN=f.match(re);if(!fN||fN[1]=='anonymous'||fN[1]=='OLmouseMove'){OLchkMh=0;
+return;}if(fN[1])s=fN[1]+'(e)';else{j=f.indexOf('{');k=f.lastIndexOf('}')+1;s=f.substring(j,k);}s+=';OLmouseMove(e);';
+mh=new Function('e',s);}OLdw.onmousemove=mh;if(OLns4)OLdw.captureEvents(Event.MOUSEMOVE);
+}
+
+/*
+ PARSING
+*/
+function OLparseTokens(pf,ar){
+var i,v,md= -1,par=(pf!='ol_'),p=OLpar,q=OLparQuo,t=OLtoggle;OLudf=(par&&!ar.length?1:0);
+for(i=0;i<ar.length;i++){if(md<0){if(typeof ar[i]=='number'){OLudf=(par?1:0);i--;}
+else{switch(pf){case 'ol_':ol_text=ar[i];break;default:o3_text=ar[i];}}md=0;}else{
+if(ar[i]==INARRAY){OLudf=0;eval(pf+'text=ol_texts['+ar[++i]+']');continue;}
+if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[++i]+']');continue;}
+if(ar[i]==CAPTION){q(ar[++i],pf+'cap');continue;}
+if(Math.abs(ar[i])==STICKY){t(ar[i],pf+'sticky');continue;}
+if(Math.abs(ar[i])==NOFOLLOW){t(ar[i],pf+'nofollow');continue;}
+if(ar[i]==BACKGROUND){q(ar[++i],pf+'background');continue;}
+if(Math.abs(ar[i])==NOCLOSE){t(ar[i],pf+'noclose');continue;}
+if(Math.abs(ar[i])==MOUSEOFF){t(ar[i],pf+'mouseoff');continue;}
+if(ar[i]==OFFDELAY){p(ar[++i],pf+'offdelay');continue;}
+if(ar[i]==RIGHT||ar[i]==LEFT||ar[i]==CENTER){p(ar[i],pf+'hpos');continue;}
+if(ar[i]==OFFSETX){p(ar[++i],pf+'offsetx');continue;}
+if(ar[i]==OFFSETY){p(ar[++i],pf+'offsety');continue;}
+if(ar[i]==FGCOLOR){q(ar[++i],pf+'fgcolor');continue;}
+if(ar[i]==BGCOLOR){q(ar[++i],pf+'bgcolor');continue;}
+if(ar[i]==CGCOLOR){q(ar[++i],pf+'cgcolor');continue;}
+if(ar[i]==TEXTCOLOR){q(ar[++i],pf+'textcolor');continue;}
+if(ar[i]==CAPCOLOR){q(ar[++i],pf+'capcolor');continue;}
+if(ar[i]==CLOSECOLOR){q(ar[++i],pf+'closecolor');continue;}
+if(ar[i]==WIDTH){p(ar[++i],pf+'width');continue;}
+if(Math.abs(ar[i])==WRAP){t(ar[i],pf+'wrap');continue;}
+if(ar[i]==WRAPMAX){p(ar[++i],pf+'wrapmax');continue;}
+if(ar[i]==HEIGHT){p(ar[++i],pf+'height');continue;}
+if(ar[i]==BORDER){p(ar[++i],pf+'border');continue;}
+if(ar[i]==BASE){p(ar[++i],pf+'base');continue;}
+if(ar[i]==STATUS){q(ar[++i],pf+'status');continue;}
+if(Math.abs(ar[i])==AUTOSTATUS){v=pf+'autostatus';
+eval(v+'=('+ar[i]+'<0)?('+v+'==2?2:0):('+v+'==1?0:1)');continue;}
+if(Math.abs(ar[i])==AUTOSTATUSCAP){v=pf+'autostatus';
+eval(v+'=('+ar[i]+'<0)?('+v+'==1?1:0):('+v+'==2?0:2)');continue;}
+if(ar[i]==CLOSETEXT){q(ar[++i],pf+'close');continue;}
+if(ar[i]==SNAPX){p(ar[++i],pf+'snapx');continue;}
+if(ar[i]==SNAPY){p(ar[++i],pf+'snapy');continue;}
+if(ar[i]==FIXX){p(ar[++i],pf+'fixx');continue;}
+if(ar[i]==FIXY){p(ar[++i],pf+'fixy');continue;}
+if(ar[i]==RELX){p(ar[++i],pf+'relx');continue;}
+if(ar[i]==RELY){p(ar[++i],pf+'rely');continue;}
+if(ar[i]==MIDX){p(ar[++i],pf+'midx');continue;}
+if(ar[i]==MIDY){p(ar[++i],pf+'midy');continue;}
+if(ar[i]==REF){q(ar[++i],pf+'ref');continue;}
+if(ar[i]==REFC){q(ar[++i],pf+'refc');continue;}
+if(ar[i]==REFP){q(ar[++i],pf+'refp');continue;}
+if(ar[i]==REFX){p(ar[++i],pf+'refx');continue;}
+if(ar[i]==REFY){p(ar[++i],pf+'refy');continue;}
+if(ar[i]==FGBACKGROUND){q(ar[++i],pf+'fgbackground');continue;}
+if(ar[i]==BGBACKGROUND){q(ar[++i],pf+'bgbackground');continue;}
+if(ar[i]==CGBACKGROUND){q(ar[++i],pf+'cgbackground');continue;}
+if(ar[i]==PADX){p(ar[++i],pf+'padxl');p(ar[++i],pf+'padxr');continue;}
+if(ar[i]==PADY){p(ar[++i],pf+'padyt');p(ar[++i],pf+'padyb');continue;}
+if(Math.abs(ar[i])==FULLHTML){t(ar[i],pf+'fullhtml');continue;}
+if(ar[i]==BELOW||ar[i]==ABOVE||ar[i]==VCENTER){p(ar[i],pf+'vpos');continue;}
+if(ar[i]==CAPICON){q(ar[++i],pf+'capicon');continue;}
+if(ar[i]==TEXTFONT){q(ar[++i],pf+'textfont');continue;}
+if(ar[i]==CAPTIONFONT){q(ar[++i],pf+'captionfont');continue;}
+if(ar[i]==CLOSEFONT){q(ar[++i],pf+'closefont');continue;}
+if(ar[i]==TEXTSIZE){q(ar[++i],pf+'textsize');continue;}
+if(ar[i]==CAPTIONSIZE){q(ar[++i],pf+'captionsize');continue;}
+if(ar[i]==CLOSESIZE){q(ar[++i],pf+'closesize');continue;}
+if(ar[i]==TIMEOUT){p(ar[++i],pf+'timeout');continue;}
+if(ar[i]==DELAY){p(ar[++i],pf+'delay');continue;}
+if(Math.abs(ar[i])==HAUTO){t(ar[i],pf+'hauto');continue;}
+if(Math.abs(ar[i])==VAUTO){t(ar[i],pf+'vauto');continue;}
+if(Math.abs(ar[i])==NOJUSTX){t(ar[i],pf+'nojustx');continue;}
+if(Math.abs(ar[i])==NOJUSTY){t(ar[i],pf+'nojusty');continue;}
+if(Math.abs(ar[i])==CLOSECLICK){t(ar[i],pf+'closeclick');continue;}
+if(ar[i]==CLOSETITLE){q(ar[++i],pf+'closetitle');continue;}
+if(ar[i]==FGCLASS){q(ar[++i],pf+'fgclass');continue;}
+if(ar[i]==BGCLASS){q(ar[++i],pf+'bgclass');continue;}
+if(ar[i]==CGCLASS){q(ar[++i],pf+'cgclass');continue;}
+if(ar[i]==TEXTPADDING){p(ar[++i],pf+'textpadding');continue;}
+if(ar[i]==TEXTFONTCLASS){q(ar[++i],pf+'textfontclass');continue;}
+if(ar[i]==CAPTIONPADDING){p(ar[++i],pf+'captionpadding');continue;}
+if(ar[i]==CAPTIONFONTCLASS){q(ar[++i],pf+'captionfontclass');continue;}
+if(ar[i]==CLOSEFONTCLASS){q(ar[++i],pf+'closefontclass');continue;}
+if(Math.abs(ar[i])==CAPBELOW){t(ar[i],pf+'capbelow');continue;}
+if(ar[i]==LABEL){q(ar[++i],pf+'label');continue;}
+if(Math.abs(ar[i])==DECODE){t(ar[i],pf+'decode');continue;}
+if(ar[i]==DONOTHING){continue;}
+i=OLparseCmdLine(pf,i,ar);}}
+if((OLfunctionPI)&&OLudf&&o3_function)o3_text=o3_function();
+if(pf=='o3_')OLfontSize();
+}
+function OLpar(a,v){eval(v+'='+a);}
+function OLparQuo(a,v){eval(v+"='"+OLescSglQt(a)+"'");}
+function OLescSglQt(s){return s.toString().replace(/\\/g,"\\\\").replace(/'/g,"\\'");}
+function OLtoggle(a,v){eval(v+'=('+v+'==0&&'+a+'>=0)?1:0');}
+function OLhasDims(s){return /[%\-a-z]+$/.test(s);}
+function OLfontSize(){
+var i;if(OLhasDims(o3_textsize)){if(OLns4)o3_textsize="2";}else
+if(!OLns4){i=parseInt(o3_textsize);o3_textsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
+if(OLhasDims(o3_captionsize)){if(OLns4)o3_captionsize="2";}else
+if(!OLns4){i=parseInt(o3_captionsize);o3_captionsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
+if(OLhasDims(o3_closesize)){if(OLns4)o3_closesize="2";}else
+if(!OLns4){i=parseInt(o3_closesize);o3_closesize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
+if(OLprintPI)OLprintDims();
+}
+function OLdecode(){
+var re=/%[0-9A-Fa-f]{2,}/,t=o3_text,c=o3_cap,u=unescape,d=!OLns4&&(!OLgek||OLgek>=20020826)&&typeof decodeURIComponent?
+decodeURIComponent:u;if(typeof(window.TypeError)=='function'){if(re.test(t)){eval(new Array('try{','o3_text=d(t);',
+'}catch(e){','o3_text=u(t);','}').join('\n'))};if(c&&re.test(c)){eval(new Array('try{','o3_cap=d(c);','}catch(e){',
+'o3_cap=u(c);','}').join('\n'))}}else{if(re.test(t))o3_text=u(t);if(c&&re.test(c))o3_cap=u(c);}
+}
+
+/*
+ LAYER FUNCTIONS
+*/
+// Writes to layer
+function OLlayerWrite(t){
+t+="\n";if(OLns4){over.document.write(t);over.document.close();}else if(typeof over.innerHTML!='undefined'){
+if(OLieM)over.innerHTML='';over.innerHTML=t;}else{var range=o3_frame.document.createRange();range.setStartAfter(over);
+var domfrag=range.createContextualFragment(t);while(over.hasChildNodes()){over.removeChild(over.lastChild);}
+over.appendChild(domfrag);}if(OLovertwoPI&&over==over2)OLover2HTML=t;else OLoverHTML=t;
+if(OLprintPI)over.print=o3_print?t:null;
+}
+
+// Makes object visible
+function OLshowObject(o){
+OLshowid=0;o=(OLns4)?o:o.style;if(((OLfilterPI)&&!OLchkFilter(o))||!OLfilterPI)o.visibility="visible";
+if(OLshadowPI)OLshowShadow();if(OLiframePI)OLshowIfs();if(OLhidePI)OLhideUtil(1,1,0);
+}
+
+// Hides object
+function OLhideObject(o){
+if(OLshowid>0){clearTimeout(OLshowid);OLshowid=0;}if(OLtimerid>0)clearTimeout(OLtimerid);
+if(OLdelayid>0)clearTimeout(OLdelayid);OLtimerid=0;OLdelayid=0;self.status="";o3_label=ol_label;
+if(o3_frame!=self)o=OLgetRefById();if(o){if(o.onmouseover)o.onmouseover=null;if(OLscrollPI&&o==over)OLclearScroll();
+if(OLdraggablePI)OLclearDrag();if(OLfilterPI)OLcleanupFilter(o);if(OLshadowPI)OLhideShadow();var os=(OLns4)?o:o.style;
+if(((OLfilterPI)&&!OLchkFadeOut(os))||!OLfilterPI){os.visibility="hidden";if(!OLie55||!OLfilterPI||!o3_filter||
+o3_fadeout<0)o.innerHTML='';}if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}
+}
+
+// Moves layer
+function OLrepositionTo(o,xL,yL){
+o=(OLns4)?o:o.style;o.left=(OLns4?xL:xL+'px');o.top=(OLns4?yL:yL+'px');
+}
+
+// Handle NOCLOSE-MOUSEOFF
+function OLoptMOUSEOFF(c){
+if(!c)o3_close="";
+over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}
+}
+function OLcursorOff(){
+var o=(OLns4?over:over.style),pHt=OLns4?over.clip.height:over.offsetHeight,left=parseInt(o.left),top=parseInt(o.top),
+right=left+o3_width,bottom=top+((OLbubblePI&&o3_bubble)?OLbubbleHt:pHt);
+if(OLx<left||OLx>right||OLy<top||OLy>bottom)return true;return false;
+}
+
+/*
+ REGISTRATION
+*/
+function OLsetRunTimeVar(){
+if(OLrunTime.length)for(var k=0;k<OLrunTime.length;k++)OLrunTime[k]();
+}
+function OLparseCmdLine(pf,i,ar){
+if(OLcmdLine.length){for(var k=0;k<OLcmdLine.length;k++){var j=OLcmdLine[k](pf,i,ar);if(j>-1){i=j;break;}}}return i;
+}
+function OLregCmds(c){
+if(typeof c!='string')return;var pM=c.split(',');pMtr=pMtr.concat(pM);
+for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+pmCnt++);
+}
+function OLregRunTimeFunc(f){
+if(typeof f=='object')OLrunTime=OLrunTime.concat(f);else OLrunTime[OLrunTime.length++]=f;
+}
+function OLregCmdLineFunc(f){
+if(typeof f=='object')OLcmdLine=OLcmdLine.concat(f);else OLcmdLine[OLcmdLine.length++]=f;
+}
+
+OLloaded=1;
diff --git a/fs_selfservice/FS-SelfService/cgi/overlibmws_crossframe.js b/fs_selfservice/FS-SelfService/cgi/overlibmws_crossframe.js new file mode 100644 index 000000000..dd6422313 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/overlibmws_crossframe.js @@ -0,0 +1,53 @@ +/*
+ overlibmws_crossframe.js plug-in module - Copyright Foteos Macrides 2003-2008. All rights reserved.
+ For support of FRAME.
+ Initial: August 3, 2003 - Last Revised: January 16, 2008
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+OLregCmds('frame');
+
+function OLparseCrossframe(pf,i,ar){
+var k=i,v;
+if(k<ar.length){
+if(ar[k]==FRAME){v=ar[++k];if(pf=='ol_')ol_frame=v;else OLoptFRAME(v);return k;}}
+return -1;
+}
+
+function OLgetFrameRef(thisFrame,ofrm){
+var i,v,retVal='';for(i=0;i<thisFrame.length;i++){if((((thisFrame[i].length>0)))&&(((OLns4))||
+((OLie4)&&(v=thisFrame[i].document.all.tags('iframe'))!=null&&v.length==0)||
+((OLns6)&&(v=thisFrame[i].document.getElementsByTagName('iframe'))!=null&&v.length==0))){
+retVal=OLgetFrameRef(thisFrame[i],ofrm);if(retVal=='')continue;}
+else if(thisFrame[i]!=ofrm)continue;retVal='['+i+']'+retVal;break;}
+return retVal;
+}
+
+function OLoptFRAME(frm){
+o3_frame=OLmkLyr('overDiv',frm)?frm:self;if(o3_frame!=self){var l,tFrm=OLgetFrameRef(top.frames,o3_frame),
+sFrm=OLgetFrameRef(top.frames,ol_frame);if(sFrm.length==tFrm.length) {l=tFrm.lastIndexOf('[');if(l){
+while(sFrm.substring(0,l)!=tFrm.substring(0,l))l=tFrm.lastIndexOf('[',l-1);tFrm=tFrm.substr(l);sFrm=sFrm.substr(l);}}
+var i,k,cnt=0,p='',str=tFrm;while((k=str.lastIndexOf('['))!= -1){cnt++;str=str.substring(0,k);}
+for(i=0;i<cnt;i++)p=p+'parent.';OLfnRef=p+'frames'+sFrm+'.';var n=window.name,o;
+if((n&&parent!=self&&o3_frame==parent)&&(o=OLgetRef(n,parent.document))){if(OLie4&&!OLop7){
+OLx=event.clientX+OLfd().scrollLeft;OLy=event.clientY+OLfd().scrollTop;}
+OLifX=OLpageLoc(o,'Left')-(OLie4&&!OLop7?OLfd().scrollLeft:self.pageXOffset);
+OLifY=OLpageLoc(o,'Top')-(OLie4&&!OLop7?OLfd().scrollTop:self.pageYOffset);}}
+}
+
+function OLchkIfRef(){
+var n=(parent!=self&&o3_frame==parent)?window.name:'',o=n?OLgetRef(n):null;
+if(o){var oR=OLgetRef(o3_ref,document);if(oR){OLrefXY=OLgetRefXY(o3_ref,document);
+OLrefXY[0]+=(OLpageLoc(o,'Left')-(OLie4&&!OLop7?OLfd(self).scrollLeft:self.pageXOffset));
+OLrefXY[1]+=(OLpageLoc(o,'Top')-(OLie4&&!OLop7?OLfd(self).scrollTop:self.pageYOffset));}}
+}
+
+OLregCmdLineFunc(OLparseCrossframe);
+
+OLcrossframePI=1;
+OLloaded=1;
diff --git a/fs_selfservice/FS-SelfService/cgi/overlibmws_draggable.js b/fs_selfservice/FS-SelfService/cgi/overlibmws_draggable.js new file mode 100644 index 000000000..1bf0ecfd1 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/overlibmws_draggable.js @@ -0,0 +1,85 @@ +/*
+ overlibmws_draggable.js plug-in module - Copyright Foteos Macrides 2002-2008. All rights reserved.
+ For support of the DRAGGABLE feature.
+ Initial: August 24, 2002 - Last Revised: January 26, 2008
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLdraggableCmds='draggable,dragcap,dragid';
+OLregCmds(OLdraggableCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('draggable'))var ol_draggable=0;
+if(OLud('dragcap'))var ol_dragcap=0;
+if(OLud('dragid'))var ol_dragid='';
+// END CONFIGURATION
+
+var o3_draggable=0,o3_dragcap=0,o3_dragid='',o3_dragging=0,OLdrg=null,OLmMv,
+OLcX,OLcY,OLcbX,OLcbY;function OLloadDraggable(){OLload(OLdraggableCmds);}
+function OLparseDraggable(pf,i,ar){var t=OLtoggle,k=i;if(k<ar.length){
+if(Math.abs(ar[k])==DRAGGABLE){t(ar[k],pf+'draggable');return k;}
+if(Math.abs(ar[k])==DRAGCAP){t(ar[k],pf+'dragcap');return k;}
+if(ar[k]==DRAGID){OLparQuo(ar[++k],pf+'dragid');return k;}}return -1;
+}
+
+function OLcheckDrag(){
+if(o3_draggable){if(o3_sticky&&(o3_frame==self))OLinitDrag();else o3_draggable=0;}
+}
+function OLinitDrag(){
+OLmMv=OLdw.onmousemove;o3_dragging=0;
+if(OLns4){document.captureEvents(Event.MOUSEDOWN|Event.CLICK);
+document.onmousedown=OLgrabEl;document.onclick=function(e){return routeEvent(e);}}
+else{var dvido=(o3_dragid)?OLgetRef(o3_dragid):null,capid=(OLovertwoPI&&over==over2?
+'overCap2':'overCap');if(dvido)dvido.onscroll=function(){OLdw.onmousemove=OLmMv;
+OLinitDrag();};OLdrg=(o3_cap&&o3_dragcap)?OLgetRef(capid):over;
+if(!OLdrg||!OLdrg.style)OLdrg=over;OLdrg.onmousedown=OLgrabEl;OLsetDrgCur(1);}
+}
+function OLsetDrgCur(d){if(!OLns4&&OLdrg)OLdrg.style.cursor=(d?'move':'auto');}
+
+function OLgrabEl(e){
+var e=(e||event);
+var cKy=(OLns4?e.modifiers&Event.ALT_MASK:(e.altKey||(OLop7&&e.ctrlKey)));o3_dragging=1;
+if(cKy){OLsetDrgCur(0);document.onmouseup=function(){OLsetDrgCur(1);o3_dragging=0;}
+return(OLns4?routeEvent(e):true);}
+OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);
+if(OLie4)over.onselectstart=function(){return false;}
+if(OLns4){OLcX=OLx;OLcY=OLy;document.captureEvents(Event.MOUSEUP)}else{
+OLcX=OLx-(OLns4?over.left:parseInt(over.style.left));
+OLcY=OLy-(OLns4?over.top:parseInt(over.style.top));
+if((OLshadowPI)&&bkdrop&&o3_shadow){OLcbX=OLx-(parseInt(bkdrop.style.left));
+OLcbY=OLy-(parseInt(bkdrop.style.top));}}OLdw.onmousemove=OLmoveEl;
+document.onmouseup=function(){
+if(OLie4)over.onselectstart=null;o3_dragging=0;OLdw.onmousemove=OLmMv;}
+return(OLns4?routeEvent(e):false);
+}
+
+function OLmoveEl(e){
+var e=(e||event);
+OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);
+if(o3_dragging){if(OLns4){over.moveBy(OLx-OLcX,OLy-OLcY);
+if(OLshadowPI&&bkdrop&&o3_shadow)bkdrop.moveBy(OLx-OLcX,OLy-OLcY);}
+else{OLrepositionTo(over,OLx-OLcX,OLy-OLcY);
+if((OLiframePI)&&OLie55&&OLifsP1)OLrepositionTo(OLifsP1,OLx-OLcX,OLy-OLcY);
+if((OLshadowPI)&&bkdrop&&o3_shadow){OLrepositionTo(bkdrop,OLx-OLcbX,OLy-OLcbY);
+if((OLiframePI)&&OLie55&&OLifsSh)OLrepositionTo(OLifsSh,OLx-OLcbX,OLy-OLcbY);}}
+if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}if(OLns4){OLcX=OLx;OLcY=OLy;}
+return false;
+}
+
+function OLclearDrag(){
+if(OLns4){document.releaseEvents(Event.MOUSEDOWN|Event.MOUSEUP|Event.CLICK);
+document.onmousedown=document.onclick=null;}else{
+if(OLdrg)OLdrg.onmousedown=null;over.onmousedown=null;OLsetDrgCur(0);}
+document.onmouseup=null;o3_dragging=0;
+}
+
+OLregRunTimeFunc(OLloadDraggable);
+OLregCmdLineFunc(OLparseDraggable);
+
+OLdraggablePI=1;
+OLloaded=1;
diff --git a/fs_selfservice/FS-SelfService/cgi/overlibmws_iframe.js b/fs_selfservice/FS-SelfService/cgi/overlibmws_iframe.js new file mode 100644 index 000000000..4c937d3d7 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/overlibmws_iframe.js @@ -0,0 +1,93 @@ +/*
+ overlibmws_iframe.js plug-in module - Copyright Foteos Macrides 2003-2008. All rights reserved.
+ Masks system controls to prevent obscuring of popops for IE v5.5 or higher.
+ Initial: October 19, 2003 - Last Revised: January 26, 2008
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+
+var OLifsP1=null,OLifsSh=null,OLifsP2=null;
+
+// IFRAME SHIM SUPPORT FUNCTIONS
+function OLinitIfs(){
+if(!OLie55)return;
+if((OLovertwoPI)&&over2&&over==over2){
+var o=o3_frame.document.all['overIframeOvertwo'];
+if(!o||OLifsP2!=o){OLifsP2=null;OLgetIfsP2Ref();}return;}
+o=o3_frame.document.all['overIframe'];
+if(!o||OLifsP1!=o){OLifsP1=null;OLgetIfsRef();}
+if((OLshadowPI)&&o3_shadow){o=o3_frame.document.all['overIframeShadow'];
+if(!o||OLifsSh!=o){OLifsSh=null;OLgetIfsShRef();}}
+}
+
+function OLsetIfsRef(o,i,z){
+o.id=i;o.src='javascript:false;';o.scrolling='no';var os=o.style;os.position='absolute';
+os.top='0px';os.left='0px';os.width='1px';os.height='1px';os.visibility='hidden';
+os.zIndex=over.style.zIndex-z;os.filter='Alpha(style=0,opacity=0)';
+}
+
+function OLgetIfsRef(){
+if(OLifsP1||!OLie55)return;
+OLifsP1=o3_frame.document.createElement('iframe');
+OLsetIfsRef(OLifsP1,'overIframe',2);
+o3_frame.document.body.appendChild(OLifsP1);
+}
+
+function OLgetIfsShRef(){
+if(OLifsSh||!OLie55)return;
+OLifsSh=o3_frame.document.createElement('iframe');
+OLsetIfsRef(OLifsSh,'overIframeShadow',3);
+o3_frame.document.body.appendChild(OLifsSh);
+}
+
+function OLgetIfsP2Ref(){
+if(OLifsP2||!OLie55)return;
+OLifsP2=o3_frame.document.createElement('iframe');
+OLsetIfsRef(OLifsP2,'overIframeOvertwo',1);
+o3_frame.document.body.appendChild(OLifsP2);
+}
+
+function OLsetDispIfs(o,w,h){
+var os=o.style;
+os.width=w+'px';os.height=h+'px';os.clip='rect(0px '+w+'px '+h+'px 0px)';
+o.filters.alpha.enabled=true;
+}
+
+function OLdispIfs(){
+if(!OLie55)return;
+var wd=over.offsetWidth,ht=over.offsetHeight;
+if(OLfilterPI&&o3_filter&&o3_filtershadow){wd+=5;ht+=5;}
+if((OLovertwoPI)&&over2&&over==over2){
+if(!OLifsP2)return;
+OLsetDispIfs(OLifsP2,wd,ht);return;}
+if(!OLifsP1)return;
+OLsetDispIfs(OLifsP1,wd,ht);
+if((!OLshadowPI)||!o3_shadow||!OLifsSh)return;
+OLsetDispIfs(OLifsSh,wd,ht);
+}
+
+function OLshowIfs(){
+if(OLifsP1){OLifsP1.style.visibility="visible";
+if((OLshadowPI)&&o3_shadow&&OLifsSh)OLifsSh.style.visibility="visible";}
+}
+
+function OLhideIfs(o){
+if(!OLie55||o!=over)return;
+if(OLifsP1)OLifsP1.style.visibility="hidden";
+if((OLshadowPI)&&o3_shadow&&OLifsSh)OLifsSh.style.visibility="hidden";
+}
+
+function OLrepositionIfs(X,Y){
+if(OLie55){if((OLovertwoPI)&&over2&&over==over2){
+if(OLifsP2)OLrepositionTo(OLifsP2,X,Y);}
+else{if(OLifsP1){OLrepositionTo(OLifsP1,X,Y);if((OLshadowPI)&&o3_shadow&&OLifsSh)
+OLrepositionTo(OLifsSh,X+o3_shadowx,Y+o3_shadowy);}}}
+}
+
+OLiframePI=1;
+OLloaded=1;
diff --git a/fs_selfservice/FS-SelfService/cgi/passwd.cgi b/fs_selfservice/FS-SelfService/cgi/passwd.cgi new file mode 100755 index 000000000..1e6e2e530 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/passwd.cgi @@ -0,0 +1,60 @@ +#!/usr/bin/perl -T +#!/usr/bin/perl -Tw + +use strict; +use FS::SelfService qw(passwd); +use CGI; +use CGI::Carp qw(fatalsToBrowser); + +my $freeside_uid = scalar(getpwnam('freeside')); + +$ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin'; +$ENV{'SHELL'} = '/bin/sh'; +$ENV{'IFS'} = " \t\n"; +$ENV{'CDPATH'} = ''; +$ENV{'ENV'} = ''; +$ENV{'BASH_ENV'} = ''; + +die "passwd.cgi isn't running as freeside user\n" if $> != $freeside_uid; + +my $cgi = new CGI; + +$cgi->param('username') =~ /^([^\n]{0,255}$)/ or die "Illegal username"; +my $me = $1; + +$cgi->param('domain') =~ /^([^\n]{0,255}$)/ or die "Illegal domain"; +my $domain = $1; + +$cgi->param('old_password') =~ /^([^\n]{0,255}$)/ or die "Illegal old_password"; +my $old_password = $1; + +$cgi->param('new_password') =~ /^([^\n]{0,255}$)/ or die "Illegal new_password"; +my $new_password = $1; + +die "New passwords don't match" + unless $new_password eq $cgi->param('new_password2'); + +my $rv = passwd( + 'username' => $me, + 'domain' => $domain, + 'old_password' => $old_password, + 'new_password' => $new_password, +); + +my $error = $rv->{error}; + +if ($error) { + die $error; +} else { + print $cgi->header(), <<END; +<html> + <head> + <title>Password changed</title> + </head> + <body bgcolor="#e8e8e8"> + <h3>Password changed</h3> +<br>Your password has been changed. + </body> +</html> +END +} diff --git a/fs_selfservice/FS-SelfService/cgi/passwd.html b/fs_selfservice/FS-SelfService/cgi/passwd.html new file mode 100644 index 000000000..459c96aa8 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/passwd.html @@ -0,0 +1,28 @@ +<html> + <head> + <title>Change password</title> + </head> + <body bgcolor="#e8e8e8"> + <h3>Change password</h3> + <form action="passwd.cgi" method="post"> + <table bgcolor="#cccccc" border=0 cellspacing=2> + <tr><th align="right">Username</th> + <td><input type="text" name="username" size="18"></td> + </tr> + <tr><th align="right">Domain</th> + <td><input type="text" name="domain" size="18"></td> + </tr> + <tr><th align="right">Current password</th> + <td><input type="password" name="old_password" size="18"></td> + </tr> + <tr><th align="right">New password</th> + <td><input type="password" name="new_password" size="18"></td> + </tr> + <tr><th align="right">Re-enter new password</th> + <td><input type="password" name="new_password2" size="18"></td> + </tr> + </table> + <br><input type="submit" value="Change password"> + </body> +</html> + diff --git a/fs_selfservice/FS-SelfService/cgi/payment_results.html b/fs_selfservice/FS-SelfService/cgi/payment_results.html new file mode 100644 index 000000000..be727cb7d --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/payment_results.html @@ -0,0 +1,11 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Payment results') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error processing your payment: $error</FONT>!; +} else { + $OUT .= 'Your payment was processed successfully. Thank you.<BR><BR>' + . $receipt_html; +} %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/post_thirdparty_payment.html b/fs_selfservice/FS-SelfService/cgi/post_thirdparty_payment.html new file mode 100644 index 000000000..17710b2e5 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/post_thirdparty_payment.html @@ -0,0 +1,42 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Pay now') %> + +<SCRIPT TYPE="text/javascript" SRC="overlibmws.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="overlibmws_iframe.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="overlibmws_draggable.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="overlibmws_crossframe.js"></SCRIPT> +<SCRIPT TYPE="text/javascript" SRC="iframecontentmws.js"></SCRIPT> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +}else{ + $OUT .= <<EOF; + You are about to contact our payment processor to pay $amount.<BR><BR> + Your transaction reference number is $reference <BR><BR> + <FORM METHOD="POST" ACTION="$popup_url"> +EOF + +#<FORM NAME="collect_popper" method="post" action="javascript:void(0)" onSubmit="popcollect()"> + my %itemhash = @collectitems; +# my $query = join(';', +# map { uri_escape($_) . '=' . uri_escape($itemhash{$_}) } +# keys(%itemhash) +# ); + foreach my $input (keys(%itemhash)) { + $OUT .= qq!<INPUT NAME="$input" TYPE="hidden" VALUE="$itemhash{$input}">\n!; + } + $OUT .= qq!<INPUT NAME="submit" TYPE="submit" VALUE="Pay now"></FORM>! +} +%> + +<%= +#<SCRIPT TYPE="text/javascript"> +# function popcollect() { +# overlib( OLiframeContent('<%= $popup_url %>', 336, 550, 'Secure Payment Area', 0, 'auto' ), CAPTION, 'Pay now', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, DRAGGABLE, CLOSECLICK, BGCOLOR, '#333399', CGCOLOR, '#333399', CLOSETEXT, 'Close' ); +# overlib( OLpostAJAX('<%= $popup_url %>', +# return false; +# } +#</SCRIPT> +%> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_bill.html b/fs_selfservice/FS-SelfService/cgi/process_change_bill.html new file mode 100644 index 000000000..bf7ad778d --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_change_bill.html @@ -0,0 +1,4 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Information updated successfully') %> +<FONT SIZE=4>Information updated successfully.</FONT> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_password.html b/fs_selfservice/FS-SelfService/cgi/process_change_password.html new file mode 100644 index 000000000..4eca91fb6 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_change_password.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "Password changed" ) %> + +<FONT SIZE=4>Password changed for <%= $value %> <%= $label %>.</FONT> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_pay.html b/fs_selfservice/FS-SelfService/cgi/process_change_pay.html new file mode 100644 index 000000000..e399aea17 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_change_pay.html @@ -0,0 +1,4 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Information updated successfully' ) %> +<FONT SIZE=4>Information updated successfully.</FONT> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_pkg.html b/fs_selfservice/FS-SelfService/cgi/process_change_pkg.html new file mode 100644 index 000000000..bf15b6ea6 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_change_pkg.html @@ -0,0 +1,4 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Package change successful') %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_change_ship.html b/fs_selfservice/FS-SelfService/cgi/process_change_ship.html new file mode 100644 index 000000000..bf7ad778d --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_change_ship.html @@ -0,0 +1,4 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Information updated successfully') %> +<FONT SIZE=4>Information updated successfully.</FONT> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_order_pkg.html b/fs_selfservice/FS-SelfService/cgi/process_order_pkg.html new file mode 100755 index 000000000..649d92092 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_order_pkg.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Package order successful') %> + +<FONT SIZE=4>Package order successful.</FONT> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_order_recharge.html b/fs_selfservice/FS-SelfService/cgi/process_order_recharge.html new file mode 100644 index 000000000..4a16ec56a --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_order_recharge.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "$svc recharged successfully") %> + +<FONT SIZE=4><%= $svc %> recharged successfully.</FONT> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_suspend_pkg.html b/fs_selfservice/FS-SelfService/cgi/process_suspend_pkg.html new file mode 100644 index 000000000..d5c62f4f1 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_suspend_pkg.html @@ -0,0 +1,3 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Package suspended') %> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_svc_acct.html b/fs_selfservice/FS-SelfService/cgi/process_svc_acct.html new file mode 100644 index 000000000..d6515e7f4 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_svc_acct.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "$svc setup successfully") %> + +<FONT SIZE=4><%= $svc %> setup successfully.</FONT> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_svc_external.html b/fs_selfservice/FS-SelfService/cgi/process_svc_external.html new file mode 100644 index 000000000..c20aae02c --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_svc_external.html @@ -0,0 +1,8 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "$svc setup successfully") %> + +<FONT SIZE=4><%= $svc %> setup successfully.</FONT> + +<BR><BR>Your serial number is <%= sprintf("%010d-$title", $id) %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/process_svc_phone.html b/fs_selfservice/FS-SelfService/cgi/process_svc_phone.html new file mode 100644 index 000000000..d6515e7f4 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/process_svc_phone.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "$svc setup successfully") %> + +<FONT SIZE=4><%= $svc %> setup successfully.</FONT> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/promocode.html b/fs_selfservice/FS-SelfService/cgi/promocode.html new file mode 100644 index 000000000..f8ee7f6eb --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/promocode.html @@ -0,0 +1,14 @@ +<HTML><HEAD><TITLE>ISP Signup</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>ISP Signup - promotional code</FONT><BR><BR> +<SCRIPT> +function gotoURL(object) { + window.location.href = 'signup.cgi?promo_code=' + object.promo_code.value; +} +</SCRIPT> +<FORM> +Enter promotional code <INPUT TYPE="text" NAME="promo_code"> +<INPUT type="submit" VALUE="Signup" onClick="gotoURL(this.form)"> + +</FORM> +</BODY> +</HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/provision.html b/fs_selfservice/FS-SelfService/cgi/provision.html new file mode 100644 index 000000000..cd8028a0d --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/provision.html @@ -0,0 +1,19 @@ +<%= $url = "$selfurl?session=$session_id;action="; + $heading1 = "Setup my services"; + $heading1 = "Package list" if $wholesale_view; + $provision_list = "provision_list"; + $provision_list = "ws_list" if $wholesale_view; + ''; %> + +<SCRIPT> +function areyousure(href, message) { + if (confirm(message) == true) + window.location.href = href; +} +</SCRIPT> + +<%= include('header', $heading1) %> + +<%= include($provision_list) %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/provision_list.html b/fs_selfservice/FS-SelfService/cgi/provision_list.html new file mode 100644 index 000000000..a1a519490 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/provision_list.html @@ -0,0 +1,97 @@ +<FONT SIZE=4>Setup services</FONT><BR><BR> + +<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffffff"> + +<%= + +foreach my $pkg ( + grep { scalar(@{$_->{part_svc}}) + || scalar(@{$_->{cust_svc}}) + } @cust_pkg + ) { + my $susp = $pkg->{'susp'} || ''; + warn $pkg->{'pkg'}. ' '.$susp."\n"; + my @pkg_actions = ( [ 'customer_change_pkg' => 'change' ] ); + push @pkg_actions, [ 'process_suspend_pkg' => 'suspend' ] + if $self_suspend_reason and !$susp; + + my $bgcolor = $susp ? '"#ff9900"' : '"#8888ff"'; + $OUT .= #'<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#ffffff">'. + '<TR><TH BGCOLOR='.$bgcolor.' COLSPAN=2>'. + $pkg->{'pkg'}. ($susp && ' (suspended)'). + '</TH><TH ALIGN="left" BGCOLOR='.$bgcolor.'>'; + foreach my $action (@pkg_actions) { + $OUT .= '(<A style="font-size: smaller;color: #000000" HREF="' . + $url . $action->[0] . ';pkgnum=' . $pkg->{'pkgnum'} . ';pkg=' . + $pkg->{'pkg'} . '">' . $action->[1] . '</A>) '; + } + $OUT .= '</TH></TR>'; + + my $col1 = "ffffff"; + my $col2 = "dddddd"; + my $col = $col1; + + foreach my $cust_svc ( @{ $pkg->{cust_svc} } ) { + my $td = qq!<TD BGCOLOR="#$col"!; + + $OUT .= '<TR>'. + "$td ALIGN=right>". $cust_svc->{label}[0]. ': </TD>'. + "$td><B>". $cust_svc->{label}[1]. '</B>'; + $OUT .= '<BR><I>password: '. encode_entities($cust_svc->{_password}). '</I>' + if exists($cust_svc->{_password}); + $OUT .= '</TD>'. + "$td><FONT SIZE=-1>"; + + #if ( $cust_svc->{label}[2] eq 'svc_acct' ) { + # $OUT .= qq!(<A HREF="${url}changepw;svcnum=$cust_svc->{'svcnum'}">!. + # 'change pw) '; + #} + + unless ( $cust_svc->{'svcnum'} == $svcnum ) { + $OUT .= qq!(<A HREF="javascript:areyousure('${url}delete_svc;svcnum=$cust_svc->{svcnum}', 'This will permanently delete the $cust_svc->{label}[1] $cust_svc->{label}[0]. Are you sure?')">!. + 'delete</A>)'; + + } + $OUT .= '</FONT></TD></TR>'; + $col = $col eq $col1 ? $col2 : $col1; + } + + $OUT .= '<TR><TD COLSPAN=3 BGCOLOR="#000000"></TD></TR>' + if scalar(@{$pkg->{part_svc}}) && scalar(@{$pkg->{cust_svc}}); + + $col = $col1; + + foreach my $part_svc ( @{ $pkg->{part_svc} } ) { + + my $td = qq!<TD BGCOLOR="#$col"!; + + my $link; + + if ( $part_svc->{'svcdb'} eq 'svc_external' + #&& $conf->exists('svc_external-skip_manual') + ) { + $link = "${url}process_svc_external;". + "pkgnum=$pkg->{'pkgnum'};". + "svcpart=$part_svc->{'svcpart'}"; + } else { + $link = "${url}provision_svc;". + "pkgnum=$pkg->{'pkgnum'};". + "svcpart=$part_svc->{'svcpart'}"; + } + + $OUT .= "<TR>$td COLSPAN=3 ALIGN=center>". + qq!<A HREF="$link">!. 'Setup '. $part_svc->{'svc'}. '</A> '. + '('. $part_svc->{'num_avail'}. ' available)'. + '</TD></TR>' + #self-service only supports these services so far + if grep { $part_svc->{'svcdb'} eq $_ } qw( svc_acct svc_external ); + + $col = $col eq $col1 ? $col2 : $col1; + } + + #$OUT .= '</TABLE><BR>'; + $OUT .= '<TR><TD BGCOLOR="#eeeeee" COLSPAN=3> </TD></TR>'; + +} %> + +</TABLE> diff --git a/fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html b/fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html new file mode 100644 index 000000000..bae57305e --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/provision_svc_acct.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Setup account') %> + +<%= include('svc_acct') %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/provision_svc_phone.html b/fs_selfservice/FS-SelfService/cgi/provision_svc_phone.html new file mode 100644 index 000000000..ab9827e93 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/provision_svc_phone.html @@ -0,0 +1,43 @@ +<%= $url = "$selfurl?session=$session_id;action="; + $heading2 = $lnp ? "Port-In Number" : "Setup phone number"; + ''; +%> +<%= include('header', $heading2) %> +<%= + +sub lnp_textfield { + my ($name,$label) = (shift,shift); + qq!<tr><td>$label</td><td><input type="text" name="$name"></td></tr>!; +} + +if($error) { + $OUT .= qq!<div style="color:red; font-size: 115%">$error</div>!; +} +%> + +<FORM name="OneTrueForm" action="<%= $url %>" METHOD="POST"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_svc_phone"> +<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%= $pkgnum %>"> +<INPUT TYPE="hidden" NAME="svcpart" VALUE="<%= $svcpart %>"> +<INPUT TYPE="hidden" NAME="numavail" VALUE="<%= $numavail %>"> +<%= +if($lnp) { + $OUT .= "<table>" + . qq!<input type="hidden" name="lnp" value="1">! + . lnp_textfield(phonenum,"Phone Number") + . lnp_textfield("lnp_desired_due_date","Requested Port-In Date") + . lnp_textfield("lnp_other_provider","Current Provider") + . lnp_textfield("lnp_other_provider_account","Current Provider's Account #") + . "</table>"; +} else { + didselector('field' => 'phonenum', + 'svcpart' => $svcpart, + 'bulknum' => $numavail, + ); +} +%> +<BR><BR><INPUT TYPE="submit" VALUE="Setup"> +</FORM> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/recharge_prepay.html b/fs_selfservice/FS-SelfService/cgi/recharge_prepay.html new file mode 100644 index 000000000..c716e8242 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/recharge_prepay.html @@ -0,0 +1,30 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Recharge with prepaid card') %> + +<FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>"> +<INPUT TYPE="hidden" NAME="action" VALUE="recharge_results"> +<TABLE BGCOLOR="#cccccc"> +<!-- +<TR> + <TD ALIGN="right">Amount Due</TD> + <TD> + <TABLE><TR><TD BGCOLOR="#ffffff"> + $<%=sprintf("%.2f",$balance)%> + </TD></TR></TABLE> + </TD> +</TR> +--> +<TR> + <TD ALIGN="right">Prepaid card number</TD> + <TD> + <INPUT TYPE="text" NAME="prepaid_cardnum" SIZE=20 MAXLENGTH=19 VALUE="<%=$prepaid_cardnum%>"> + </TD> +</TR> +</TABLE> +<BR> +<INPUT TYPE="hidden" NAME="paybatch" VALUE="<%=$paybatch%>"> +<INPUT TYPE="submit" NAME="process" VALUE="Recharge"> <!-- onClick="this.disabled=true"> --> +</FORM> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/recharge_results.html b/fs_selfservice/FS-SelfService/cgi/recharge_results.html new file mode 100644 index 000000000..147b66bbe --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/recharge_results.html @@ -0,0 +1,18 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Recharge results') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error processing your prepaid card: $error</FONT>!; +} else { + $OUT .= 'Prepaid card recharge successful!<BR><BR>'; + + $OUT .= '$'. sprintf('%.2f', $amount). ' added to your account.<BR><BR>' + if $amount; + + $OUT .= $duration. ' added to your account.<BR><BR>' + if $seconds; + + $OUT .= 'Thank you.'; +} %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/regcode.html b/fs_selfservice/FS-SelfService/cgi/regcode.html new file mode 100644 index 000000000..e639b9b53 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/regcode.html @@ -0,0 +1,14 @@ +<HTML><HEAD><TITLE>ISP Signup</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>ISP Signup - registration code</FONT><BR><BR> +<SCRIPT> +function gotoURL(object) { + window.location.href = 'signup.cgi?reg_code=' + object.reg_code.value; +} +</SCRIPT> +<FORM> +Enter registration code <INPUT TYPE="text" NAME="reg_code"> +<INPUT type="submit" VALUE="Signup" onClick="gotoURL(this.form)"> + +</FORM> +</BODY> +</HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi new file mode 100644 index 000000000..0e8b990da --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi @@ -0,0 +1,977 @@ +#!/usr/bin/perl -Tw + +use strict; +use vars qw($DEBUG $cgi $session_id $form_max $template_dir); +use subs qw(do_template); +use CGI; +use CGI::Carp qw(fatalsToBrowser); +use Text::Template; +use HTML::Entities; +use Date::Format; +use Date::Parse 'str2time'; +use Number::Format 1.50; +use FS::SelfService qw( + access_info login_info login customer_info edit_info invoice + payment_info process_payment realtime_collect process_prepay + list_pkgs order_pkg signup_info order_recharge + part_svc_info provision_acct provision_external provision_phone + unprovision_svc change_pkg suspend_pkg domainselector + list_svcs list_svc_usage list_cdr_usage list_support_usage + myaccount_passwd list_invoices create_ticket get_ticket did_report + mason_comp port_graph +); + +$template_dir = '.'; + +$DEBUG = 0; + +$form_max = 255; + +$cgi = new CGI; + +unless ( defined $cgi->param('session') ) { + my $login_info = login_info( 'agentnum' => scalar($cgi->param('agentnum')) ); + + do_template('login', $login_info ); + exit; +} + +if ( $cgi->param('session') eq 'login' ) { + + $cgi->param('username') =~ /^\s*([a-z0-9_\-\.\&]{0,$form_max})\s*$/i + or die "illegal username"; + my $username = $1; + + $cgi->param('domain') =~ /^\s*([\w\-\.]{0,$form_max})\s*$/ + or die "illegal domain"; + my $domain = $1; + + $cgi->param('password') =~ /^(.{0,$form_max})$/ + or die "illegal password"; + my $password = $1; + + my $rv = login( + 'username' => $username, + 'domain' => $domain, + 'password' => $password, + ); + if ( $rv->{error} ) { + my $login_info = login_info( 'agentnum' => $cgi->param('agentnum') ); + do_template('login', { + 'error' => $rv->{error}, + 'username' => $username, + 'domain' => $domain, + %$login_info, + } ); + exit; + } else { + $cgi->param('session' => $rv->{session_id} ); + $cgi->param('action' => 'myaccount' ); + } +} + +$session_id = $cgi->param('session'); + +#order|pw_list XXX ??? +my @actions = ( qw( + myaccount + tktcreate + tktview + didreport + invoices + view_invoice + make_payment + make_ach_payment + make_term_payment + make_thirdparty_payment + post_thirdparty_payment + payment_results + ach_payment_results + recharge_prepay + recharge_results + logout + change_bill + change_ship + change_pay + process_change_bill + process_change_ship + process_change_pay + customer_order_pkg + process_order_pkg + customer_change_pkg + process_change_pkg + process_order_recharge + provision + provision_svc + process_svc_acct + process_svc_phone + process_svc_external + delete_svc + view_usage + view_usage_details + view_cdr_details + view_support_details + view_port_graph + real_port_graph + change_password + process_change_password + customer_suspend_pkg + process_suspend_pkg +)); + +$cgi->param('action') =~ ( '^(' . join('|', @actions) . ')$' ) + or die "unknown action ". $cgi->param('action'); +my $action = $1; + +warn "calling $action sub\n" + if $DEBUG; +$FS::SelfService::DEBUG = $DEBUG; +my $result = eval "&$action();"; +die $@ if $@; + +warn Dumper($result) if $DEBUG; + +if ( $result->{error} && ( $result->{error} eq "Can't resume session" + || $result->{error} eq "Expired session") ) { #ick + + my $login_info = login_info(); + do_template('login', $login_info); + exit; +} + +#warn $result->{'open_invoices'}; +#warn scalar(@{$result->{'open_invoices'}}); + +warn "processing template $action\n" + if $DEBUG; +do_template($action, { + 'session_id' => $session_id, + 'action' => $action, #so the menu knows what tab we're on... + #%{ payment_info( 'session_id' => $session_id ) }, # cust_paybys for the menu + %{$result} +}); + +#-- + +use Data::Dumper; +sub myaccount { + customer_info( 'session_id' => $session_id ); +} + +sub change_bill { my $payment_info = + payment_info( 'session_id' => $session_id ); + return $payment_info if ( $payment_info->{'error'} ); + my $customer_info = + customer_info( 'session_id' => $session_id ); + return { + %$payment_info, + %$customer_info, + }; + } +sub change_ship { change_bill(@_); } +sub change_pay { change_bill(@_); } + +sub _process_change_info { + my ($erroraction, @fields) = @_; + + my $results = ''; + + $results ||= edit_info ( + 'session_id' => $session_id, + map { ($_ => $cgi->param($_)) } grep { defined($cgi->param($_)) } @fields, + ); + + + if ( $results->{'error'} ) { + no strict 'refs'; + $action = $erroraction; + return { + $cgi->Vars, + %{&$action()}, + 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>', + }; + } else { + return $results; + } +} + +sub process_change_bill { + _process_change_info( 'change_bill', + qw( first last company address1 address2 city state + county zip country daytime night fax ) + ); +} + +sub process_change_ship { + my @list = map { "ship_$_" } + qw( first last company address1 address2 city state + county zip country daytime night fax + ); + if ($cgi->param('same') eq 'Y') { + foreach (@list) { $cgi->param($_, '') } + } + + _process_change_info( 'change_ship', @list ); +} + +sub process_change_pay { + my $postal = $cgi->param( 'postal_invoicing' ); + my $payby = $cgi->param( 'payby' ); + my @list = + qw( payby payinfo payinfo1 payinfo2 month year payname + address1 address2 city county state zip country auto paytype + paystate ss stateid stateid_state invoicing_list + ); + push @list, 'postal_invoicing' if $postal; + unless ( $payby ne 'BILL' + || $postal + || $cgi->param( 'invoicing_list' ) + ) + { + $action = 'change_pay'; + return { + %{&change_pay()}, + $cgi->Vars, + 'error' => '<FONT COLOR="#FF0000">Postal or email required.</FONT>', + }; + } + _process_change_info( 'change_pay', @list ); +} + +sub view_invoice { + + $cgi->param('invnum') =~ /^(\d+)$/ or die "illegal invnum"; + my $invnum = $1; + + invoice( 'session_id' => $session_id, + 'invnum' => $invnum, + ); + +} + +sub invoices { + list_invoices( 'session_id' => $session_id, ); +} + +sub tktcreate { + my $customer_info = customer_info( 'session_id' => $session_id ); + return $customer_info if ( $customer_info->{'error'} ); + + my $requestor = ""; + if ( $customer_info->{'invoicing_list'} ) { + my @requestor = split( /\s*\,\s*/, $customer_info->{'invoicing_list'} ); + $requestor = $requestor[0] if scalar(@requestor); + } + + return { 'requestor' => $requestor } + unless ($cgi->param('subject') && $cgi->param('message') && + length($cgi->param('subject')) && length($cgi->param('message'))); + + create_ticket( 'session_id' => $session_id, + 'subject' => $cgi->param('subject'), + 'message' => $cgi->param('message'), + 'requestor' => $requestor, + ); +} + +sub tktview { + get_ticket( 'session_id' => $session_id, + 'ticket_id' => $cgi->param('ticket_id'), + 'reply' => $cgi->param('reply'), + ); +} + +sub customer_order_pkg { + my $init_data = signup_info( 'customer_session_id' => $session_id ); + return $init_data if ( $init_data->{'error'} ); + + my $customer_info = customer_info( 'session_id' => $session_id ); + return $customer_info if ( $customer_info->{'error'} ); + + my $pkgselect = mason_comp( + 'session_id' => $session_id, + 'comp' => '/edit/cust_main/first_pkg/select-part_pkg.html', + 'args' => [ 'password_verify' => 1, + 'onchange' => 'enable_order_pkg()', + 'relurls' => 1, + 'empty_label' => 'Select package', + ], + ); + + $pkgselect = $pkgselect->{'error'} || $pkgselect->{'output'}; + + return { + ( map { $_ => $init_data->{$_} } + qw( part_pkg security_phrase svc_acct_pop ), + ), + %$customer_info, + 'pkg_selector' => $pkgselect, + }; +} + +sub customer_change_pkg { + my $init_data = signup_info( 'customer_session_id' => $session_id ); + return $init_data if ( $init_data->{'error'} ); + + my $customer_info = customer_info( 'session_id' => $session_id ); + return $customer_info if ( $customer_info->{'error'} ); + + return { + ( map { $_ => $init_data->{$_} } + qw( part_pkg security_phrase svc_acct_pop ), + ), + ( map { $_ => $cgi->param($_) } + qw( pkgnum pkg ) + ), + %$customer_info, + }; +} + +sub process_order_pkg { + + my $results = ''; + + my @params = (qw( custnum pkgpart )); + my $svcdb = ''; + if ( $cgi->param('pkgpart_svcpart') =~ /^(\d+)_(\d+)$/ ) { + $cgi->param('pkgpart', $1); + $cgi->param('svcpart', $2); + push @params, 'svcpart'; + $svcdb = $cgi->param('svcdb'); + push @params, 'domsvc' if $svcdb eq 'svc_acct'; + } else { + $svcdb = 'svc_acct'; + } + + if ( $svcdb eq 'svc_acct' ) { + + push @params, qw( username _password _password2 sec_phrase popnum ); + + unless ( length($cgi->param('_password')) ) { + my $init_data = signup_info( 'customer_session_id' => $session_id ); + $results = { 'error' => $init_data->{msgcat}{empty_password} }; + $results = { 'error' => $init_data->{error} } if($init_data->{error}); + } + if ( $cgi->param('_password') ne $cgi->param('_password2') ) { + my $init_data = signup_info( 'customer_session_id' => $session_id ); + $results = { 'error' => $init_data->{msgcat}{passwords_dont_match} }; + $results = { 'error' => $init_data->{error} } if($init_data->{error}); + $cgi->param('_password', ''); + $cgi->param('_password2', ''); + } + + } elsif ( $svcdb eq 'svc_phone' ) { + + push @params, qw( phonenum sip_password pin phone_name ); + + } else { + die "$svcdb not handled on process_order_pkg yet"; + } + + $results ||= order_pkg ( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } @params + ); + + + if ( $results->{'error'} ) { + $action = 'customer_order_pkg'; + return { + $cgi->Vars, + %{customer_order_pkg()}, + 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>', + }; + } else { + return $results; + } + +} + +sub process_change_pkg { + + my $results = ''; + + $results ||= change_pkg ( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } + qw( pkgpart pkgnum ) + ); + + + if ( $results->{'error'} ) { + $action = 'customer_change_pkg'; + return { + $cgi->Vars, + %{customer_change_pkg()}, + 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>', + }; + } else { + return $results; + } + +} + +sub process_suspend_pkg { + my $results = ''; + $results = suspend_pkg ( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } + qw( pkgnum ) + ); + if ( $results->{'error'} ) { + $action = 'provision'; + return { + 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>', + } + } + else { + return $results; + } +} + +sub process_order_recharge { + + my $results = ''; + + $results ||= order_recharge ( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } + qw( svcnum ) + ); + + + if ( $results->{'error'} ) { + $action = 'view_usage'; + if ($results->{'error'} eq '_decline') { + $results->{'error'} = "There has been an error processing your account. Please contact customer support." + } + return { + $cgi->Vars, + %{view_usage()}, + 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>', + }; + } else { + return $results; + } + +} + +sub make_payment { + payment_info( 'session_id' => $session_id ); +} + +sub payment_results { + + use Business::CreditCard 0.30; + + #we should only do basic checking here for DoS attacks and things + #that couldn't be constructed by the web form... let process_payment() do + #the rest, it gives better error messages + + $cgi->param('amount') =~ /^\s*(\d+(\.\d{2})?)\s*$/ + or die "Illegal amount: ". $cgi->param('amount'); #!!! + my $amount = $1; + + my $payinfo = $cgi->param('payinfo'); + $payinfo =~ s/[^\dx]//g; + $payinfo =~ /^([\dx]{13,16})$/ + #or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + or die "illegal card"; #!!! + $payinfo = $1; + unless ( $payinfo =~ /x/ ) { + validate($payinfo) + #or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + or die "invalid card"; #!!! + } + + if ( $cgi->param('card_type') ) { + cardtype($payinfo) eq $cgi->param('card_type') + #or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type'); + or die "not a ". $cgi->param('card_type'); + } + + $cgi->param('paycvv') =~ /^\s*(.{0,4})\s*$/ or die "illegal CVV2"; + my $paycvv = $1; + + $cgi->param('month') =~ /^(\d{2})$/ or die "illegal month"; + my $month = $1; + $cgi->param('year') =~ /^(\d{4})$/ or die "illegal year"; + my $year = $1; + + $cgi->param('payname') =~ /^(.{0,80})$/ or die "illegal payname"; + my $payname = $1; + + $cgi->param('address1') =~ /^(.{0,80})$/ or die "illegal address1"; + my $address1 = $1; + + $cgi->param('address2') =~ /^(.{0,80})$/ or die "illegal address2"; + my $address2 = $1; + + $cgi->param('city') =~ /^(.{0,80})$/ or die "illegal city"; + my $city = $1; + + $cgi->param('state') =~ /^(.{0,80})$/ or die "illegal state"; + my $state = $1; + + $cgi->param('zip') =~ /^(.{0,10})$/ or die "illegal zip"; + my $zip = $1; + + $cgi->param('country') =~ /^(.{0,2})$/ or die "illegal country"; + my $country = $1; + + my $save = 0; + $save = 1 if $cgi->param('save'); + + my $auto = 0; + $auto = 1 if $cgi->param('auto'); + + $cgi->param('paybatch') =~ /^([\w\-\.]+)$/ or die "illegal paybatch"; + my $paybatch = $1; + + $cgi->param('discount_term') =~ /^(\d*)$/ or die "illegal discount_term"; + my $discount_term = $1; + + + process_payment( + 'session_id' => $session_id, + 'payby' => 'CARD', + 'amount' => $amount, + 'payinfo' => $payinfo, + 'paycvv' => $paycvv, + 'month' => $month, + 'year' => $year, + 'payname' => $payname, + 'address1' => $address1, + 'address2' => $address2, + 'city' => $city, + 'state' => $state, + 'zip' => $zip, + 'country' => $country, + 'save' => $save, + 'auto' => $auto, + 'paybatch' => $paybatch, + 'discount_term' => $discount_term, + ); + +} + +sub make_ach_payment { + payment_info( 'session_id' => $session_id ); +} + +sub ach_payment_results { + + #we should only do basic checking here for DoS attacks and things + #that couldn't be constructed by the web form... let process_payment() do + #the rest, it gives better error messages + + $cgi->param('amount') =~ /^\s*(\d+(\.\d{2})?)\s*$/ + or die "illegal amount"; #!!! + my $amount = $1; + + my $payinfo1 = $cgi->param('payinfo1'); + $payinfo1 =~ s/[^\dx]//g; + $payinfo1 =~ /^([\dx]+)$/ + or die "illegal account"; #!!! + $payinfo1 = $1; + + my $payinfo2 = $cgi->param('payinfo2'); + $payinfo2 =~ s/[^\dx]//g; + $payinfo2 =~ /^([\dx]+)$/ + or die "illegal ABA/routing code"; #!!! + $payinfo2 = $1; + + $cgi->param('payname') =~ /^(.{0,80})$/ or die "illegal payname"; + my $payname = $1; + + $cgi->param('paystate') =~ /^(.{0,2})$/ or die "illegal paystate"; + my $paystate = $1; + + $cgi->param('paytype') =~ /^(.{0,80})$/ or die "illegal paytype"; + my $paytype = $1; + + $cgi->param('ss') =~ /^(.{0,80})$/ or die "illegal ss"; + my $ss = $1; + + $cgi->param('stateid') =~ /^(.{0,80})$/ or die "illegal stateid"; + my $stateid = $1; + + $cgi->param('stateid_state') =~ /^(.{0,2})$/ or die "illegal stateid_state"; + my $stateid_state = $1; + + my $save = 0; + $save = 1 if $cgi->param('save'); + + my $auto = 0; + $auto = 1 if $cgi->param('auto'); + + $cgi->param('paybatch') =~ /^([\w\-\.]+)$/ or die "illegal paybatch"; + my $paybatch = $1; + + process_payment( + 'session_id' => $session_id, + 'payby' => 'CHEK', + 'amount' => $amount, + 'payinfo1' => $payinfo1, + 'payinfo2' => $payinfo2, + 'month' => '12', + 'year' => '2037', + 'payname' => $payname, + 'paytype' => $paytype, + 'paystate' => $paystate, + 'ss' => $ss, + 'stateid' => $stateid, + 'stateid_state' => $stateid_state, + 'save' => $save, + 'auto' => $auto, + 'paybatch' => $paybatch, + ); + +} + +sub make_thirdparty_payment { + payment_info('session_id' => $session_id); +} + +sub post_thirdparty_payment { + $cgi->param('payby_method') =~ /^(CC|ECHECK)$/ + or die "illegal payby method"; + my $method = $1; + $cgi->param('amount') =~ /^(\d+(\.\d*)?)$/ + or die "illegal amount"; + my $amount = $1; + my $result = realtime_collect( + 'session_id' => $session_id, + 'method' => $method, + 'amount' => $amount, + ); + $result; +} + +sub make_term_payment { + $cgi->param('amount') =~ /^(\d+\.\d{2})$/ + or die "illegal payment amount"; + my $balance = $1; + $cgi->param('discount_term') =~ /^(\d+)$/ + or die "illegal discount term"; + my $discount_term = $1; + $action = 'make_payment'; + ({ %{payment_info( 'session_id' => $session_id )}, + 'balance' => $balance, + 'discount_term' => $discount_term, + }) +} + +sub recharge_prepay { + customer_info( 'session_id' => $session_id ); +} + +sub recharge_results { + + my $prepaid_cardnum = $cgi->param('prepaid_cardnum'); + $prepaid_cardnum =~ s/\W//g; + $prepaid_cardnum =~ /^(\w*)$/ or die "illegal prepaid card number"; + $prepaid_cardnum = $1; + + process_prepay ( 'session_id' => $session_id, + 'prepaid_cardnum' => $prepaid_cardnum, + ); +} + +sub logout { + FS::SelfService::logout( 'session_id' => $session_id ); +} + +sub didreport { + my $result = did_report( 'session_id' => $session_id, + 'format' => $cgi->param('type'), + 'recentonly' => $cgi->param('recentonly'), + ); + die $result->{'error'} if exists $result->{'error'} && $result->{'error'}; + $result; +} + +sub provision { + my $result = list_pkgs( 'session_id' => $session_id ); + die $result->{'error'} if exists $result->{'error'} && $result->{'error'}; + $result->{'pkgpart'} = $cgi->param('pkgpart') if $cgi->param('pkgpart'); + $result->{'filter'} = $cgi->param('filter') if $cgi->param('filter'); + $result; +} + +sub provision_svc { + + my $result = part_svc_info( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( pkgnum svcpart ), + ); + die $result->{'error'} if exists $result->{'error'} && $result->{'error'}; + + $result->{'svcdb'} =~ /^svc_(.*)$/ + #or return { 'error' => 'Unknown svcdb '. $result->{'svcdb'} }; + or die 'Unknown svcdb '. $result->{'svcdb'}; + $action .= "_$1"; + + $result->{'numavail'} = $cgi->param('numavail'); + $result->{'lnp'} = $cgi->param('lnp'); + + $result; +} + +sub process_svc_phone { + my @bulkdid = $cgi->param('bulkdid'); + my $phonenum = $cgi->param('phonenum'); + my $lnp = $cgi->param('lnp'); + + my $result; + if($lnp) { + $result = provision_phone ( + 'session_id' => $session_id, + 'countrycode' => '1', + map { $_ => $cgi->param($_) } qw( pkgnum svcpart phonenum + lnp_desired_due_date lnp_other_provider + lnp_other_provider_account ) + ); + } else { + $result = provision_phone ( + 'session_id' => $session_id, + 'bulkdid' => [ @bulkdid ], + 'countrycode' => '1', + map { $_ => $cgi->param($_) } qw( pkgnum svcpart phonenum ) + ); + } + + if ( exists $result->{'error'} && $result->{'error'} ) { + $action = 'provision_svc_phone'; + return { + $cgi->Vars, + %{ part_svc_info( 'session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( pkgnum svcpart ) + ) + }, + 'error' => $result->{'error'}, + }; + } + + $result; +} + +sub process_svc_acct { + + my $result = provision_acct ( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( + pkgnum svcpart username domsvc _password _password2 sec_phrase popnum ) + ); + + if ( exists $result->{'error'} && $result->{'error'} ) { + #warn "$result $result->{'error'}"; + $action = 'provision_svc_acct'; + return { + $cgi->Vars, + %{ part_svc_info( 'session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( pkgnum svcpart ) + ) + }, + 'error' => $result->{'error'}, + }; + } else { + #warn "$result $result->{'error'}"; + return $result; + } + +} + +sub process_svc_external { + provision_external ( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( pkgnum svcpart ) + ); +} + +sub delete_svc { + unprovision_svc( + 'session_id' => $session_id, + 'svcnum' => $cgi->param('svcnum'), + ); +} + +sub view_usage { + list_svcs( + 'session_id' => $session_id, + 'svcdb' => [ 'svc_acct', 'svc_phone', 'svc_port', ], + 'ncancelled' => 1, + ); +} + +sub real_port_graph { + my $svcnum = $cgi->param('svcnum'); + my $res = port_graph( + 'session_id' => $session_id, + 'svcnum' => $svcnum, + 'beginning' => str2time($cgi->param('start')." 00:00:00"), + 'ending' => str2time($cgi->param('end')." 23:59:59"), + ); + my @usage = @{$res->{'usage'}}; + my $png = $usage[0]->{'png'}; + { 'content' => $png, 'format' => 'png' }; +} + +sub view_port_graph { + my $svcnum = $cgi->param('svcnum'); + { 'svcnum' => $svcnum, + 'start' => $cgi->param($svcnum.'_start'), + 'end' => $cgi->param($svcnum.'_end'), + } +} + +sub view_usage_details { + list_svc_usage( + 'session_id' => $session_id, + 'svcnum' => $cgi->param('svcnum'), + 'beginning' => $cgi->param('beginning') || '', + 'ending' => $cgi->param('ending') || '', + ); +} + +sub view_cdr_details { + list_cdr_usage( + 'session_id' => $session_id, + 'svcnum' => $cgi->param('svcnum'), + 'beginning' => $cgi->param('beginning') || '', + 'ending' => $cgi->param('ending') || '', + ); +} + +sub view_support_details { + list_support_usage( + 'session_id' => $session_id, + 'svcnum' => $cgi->param('svcnum'), + 'beginning' => $cgi->param('beginning') || '', + 'ending' => $cgi->param('ending') || '', + ); +} + +sub change_password { + list_svcs( + 'session_id' => $session_id, + 'svcdb' => 'svc_acct', + ); +}; + +sub process_change_password { + + my $result = myaccount_passwd( + 'session_id' => $session_id, + map { $_ => $cgi->param($_) } qw( svcnum new_password new_password2 ) + ); + + if ( exists $result->{'error'} && $result->{'error'} ) { + + $action = 'change_password'; + return { + $cgi->Vars, + %{ list_svcs( 'session_id' => $session_id, + 'svcdb' => 'svc_acct', + ) + }, + #'svcnum' => $cgi->param('svcnum'), + 'error' => $result->{'error'} + }; + + } else { + + return $result; + + } + +} + +#-- + +sub do_template { + my $name = shift; + my $fill_in = shift; + + $cgi->delete_all(); + $fill_in->{'selfurl'} = $cgi->self_url; + $fill_in->{'cgi'} = \$cgi; + + my $access_info = $session_id + ? access_info( 'session_id' => $session_id ) + : {}; + $fill_in->{$_} = $access_info->{$_} foreach keys %$access_info; + + + if($result && ref($result) && $result->{'format'} && $result->{'content'} + && $result->{'format'} eq 'csv') { + print $cgi->header('-expires' => 'now', + '-Content-Type' => 'text/csv', + '-Content-Disposition' => "attachment;filename=output.csv", + ), + $result->{'content'}; + } + elsif($result && ref($result) && $result->{'format'} && $result->{'content'} + && $result->{'format'} eq 'xls') { + print $cgi->header('-expires' => 'now', + '-Content-Type' => 'application/vnd.ms-excel', + '-Content-Disposition' => "attachment;filename=output.xls", + '-Content-Length' => length($result->{'content'}), + ), + $result->{'content'}; + } + elsif($result && ref($result) && $result->{'format'} && $result->{'content'} + && $result->{'format'} eq 'png') { + print $cgi->header('-expires' => 'now', + '-Content-Type' => 'image/png', + ), + $result->{'content'}; + } + else { + my $source = "$template_dir/$name.html"; + my $template = new Text::Template( TYPE => 'FILE', + SOURCE => $source, + DELIMITERS => [ '<%=', '%>' ], + UNTAINT => 1, + ) + or die $Text::Template::ERROR; + + my $data = $template->fill_in( + PACKAGE => 'FS::SelfService::_selfservicecgi', + HASH => $fill_in, + ) || "Error processing template $source"; # at least print _something_ + print $cgi->header( '-expires' => 'now' ); + print $data; + } + } + +#*FS::SelfService::_selfservicecgi::include = \&Text::Template::fill_in_file; + +package FS::SelfService::_selfservicecgi; + +use HTML::Entities; +use FS::SelfService qw( + regionselector popselector domainselector location_form didselector +); + +#false laziness w/agent.cgi +use vars qw(@INCLUDE_ARGS); +sub include { + my $name = shift; + + @INCLUDE_ARGS = @_; + + my $template = new Text::Template( TYPE => 'FILE', + SOURCE => "$main::template_dir/$name.html", + DELIMITERS => [ '<%=', '%>' ], + UNTAINT => 1, + ) + or die $Text::Template::ERROR; + + $template->fill_in( PACKAGE => 'FS::SelfService::_selfservicecgi', + #HASH => $fill_in + ); + +} + +1; diff --git a/fs_selfservice/FS-SelfService/cgi/signup-agentselect.html b/fs_selfservice/FS-SelfService/cgi/signup-agentselect.html new file mode 100755 index 000000000..7851c5601 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/signup-agentselect.html @@ -0,0 +1,195 @@ +<HTML><HEAD><TITLE>ISP Signup form</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>ISP Signup form</FONT><BR><BR> +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> +<FORM NAME="OneTrueForm" ACTION="<%= $self_url %>" METHOD=POST onSubmit="document.OneTrueForm.signup.disabled=true"> +<INPUT TYPE="hidden" NAME="magic" VALUE="process"> +<INPUT TYPE="hidden" NAME="ref" VALUE="<%= $referral_custnum %>"> +<INPUT TYPE="hidden" NAME="ss" VALUE=""> +Agent <SELECT NAME="agentnum"> +<%= + warn $init_data; + warn $init_data->{'agent'}; + foreach my $agent ( @{$init_data->{'agent'}} ) { + $OUT .= '<OPTION VALUE="'. $agent->{'agentnum'}. '"'; + $OUT .= ' SELECTED' if $agent->{'agentnum'} eq $agentnum; + $OUT .= '>'. $agent->{'agent'}; + } +%> +</SELECT><BR><BR> +Contact Information +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Contact name<BR>(last, first)</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="last" VALUE="<%= $last %>">, + <INPUT TYPE="text" NAME="first" VALUE="<%= $first %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="company" SIZE=70 VALUE="<%= $company %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Address</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address1" SIZE=70 VALUE="<%= $address1 %>"></TD> +</TR> +<TR> + <TD ALIGN="right"> </TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address2" SIZE=70 VALUE="<%= $address2 %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>City</TH> + <TD><INPUT TYPE="text" NAME="city" VALUE="<%= $city %>"></TD> + <TH ALIGN="right"><font color="#ff0000">*</font>State/Country</TH> + <TD> + <%= + ($county_html, $state_html, $country_html) = + regionselector( $county, $state, $country ); + + "$county_html $state_html"; + %> + </TD> + <TH><font color="#ff0000">*</font>Zip</TH> + <TD><INPUT TYPE="text" NAME="zip" SIZE=10 VALUE="<%= $zip %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Country</TH> + <TD><%= $country_html %></TD> +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="daytime" VALUE="<%= $daytime %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="night" VALUE="<%= $night %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="<%= $fax %>" SIZE=12></TD> +</TR> +</TABLE><font color="#ff0000">*</font> required fields<BR> +<BR>Billing information<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR><TD> + + <%= + $OUT .= '<INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST"'; + my @invoicing_list = split(', ', $invoicing_list ); + $OUT .= ' CHECKED' + if ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list; + $OUT .= '>'; + %> + + Postal mail invoice +</TD></TR> +<TR><TD>Email invoice <INPUT TYPE="text" NAME="invoicing_list" VALUE="<%= join(', ', grep { $_ ne 'POST' } split(', ', $invoicing_list ) ) %>"> +</TD></TR> +<%= scalar(@payby) > 1 ? '<TR><TD>Billing type</TD></TR>' : '' %> +</TABLE> +<TABLE BGCOLOR="#c0c0c0" BORDER=1 WIDTH="100%"> +<TR> + + <%= + + my $cardselect = '<SELECT NAME="CARD_type"><OPTION></OPTION>'; + my %types = ( + 'VISA' => 'VISA card', + 'MasterCard' => 'MasterCard', + 'Discover' => 'Discover card', + 'American Express' => 'American Express card', + ); + foreach ( keys %types ) { + $selected = $cgi->param('CARD_type') eq $types{$_} ? 'SELECTED' : ''; + $cardselect .= qq!<OPTION $selected VALUE="$types{$_}">$_</OPTION>!; + } + $cardselect .= '</SELECT>'; + + my %payby = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", "12-2037"). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="Accounts Payable">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("COMP"), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="" MAXLENGTH=80>!, + ); + + my( $account, $aba ) = split('@', $payinfo); + my %paybychecked = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="$payname">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", $paydate). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("COMP", $paydate), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="$payinfo" MAXLENGTH=80>!, + ); + + for (@payby) { + if ( scalar(@payby) == 1) { + $OUT .= '<TD VALIGN=TOP>'. + qq!<INPUT TYPE="hidden" NAME="payby" VALUE="$_">!. + "$paybychecked{$_}</TD>"; + } else { + $OUT .= qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!; + if ($payby eq $_) { + $OUT .= qq! CHECKED> $paybychecked{$_}</TD>!; + } else { + $OUT .= qq!> $payby{$_}</TD>!; + } + + } + } + %> + +</TR></TABLE><font color="#ff0000">*</font> required fields for each billing type +<BR><BR>First package +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TD COLSPAN=2><SELECT NAME="pkgpart"><OPTION VALUE="">(none) + + <%= + foreach my $package ( @{$packages} ) { + $OUT .= '<OPTION VALUE="'. $package->{'pkgpart'}. '"'; + $OUT .= ' SELECTED' if $pkgpart && $package->{'pkgpart'} == $pkgpart; + $OUT .= '>'. $package->{'pkg'}; + } + %> + + </SELECT></TD> +</TR> +<TR> + <TD ALIGN="right">Username</TD> + <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Password</TD> + <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Re-enter Password</TD> + <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>"></TD> +</TR> +<%= + if ( $init_data->{'security_phrase'} ) { + $OUT .= <<ENDOUT; +<TR> + <TD ALIGN="right">Security Phrase</TD> + <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase"> + </TD> +</TR> +ENDOUT + } else { + $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">'; + } +%> +<%= + if ( scalar(@$pops) ) { + $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector($popnum). '</TD></TR>'; + } else { + $OUT .= popselector($popnum); + } +%> +</TABLE> +<BR><BR><INPUT TYPE="submit" NAME="signup" VALUE="Signup" > +</FORM></BODY></HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/signup-alternate.html b/fs_selfservice/FS-SelfService/cgi/signup-alternate.html new file mode 100755 index 000000000..490cefa5e --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/signup-alternate.html @@ -0,0 +1,218 @@ +<HTML><HEAD><TITLE>ISP Signup form</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>ISP Signup form</FONT><BR><BR> +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> +<FORM NAME="dummy"> +<INPUT TYPE="hidden" NAME="magic" VALUE="process"> +<INPUT TYPE="hidden" NAME="ref" VALUE="<%= $referral_custnum %>"> +<INPUT TYPE="hidden" NAME="ss" VALUE=""> +<INPUT TYPE="hidden" NAME="agentnum" VALUE="3"> +Contact Information +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Contact name<BR>(last, first)</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="last" VALUE="<%= $last %>">, + <INPUT TYPE="text" NAME="first" VALUE="<%= $first %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="company" SIZE=70 VALUE="<%= $company %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Address</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address1" SIZE=70 VALUE="<%= $address1 %>"></TD> +</TR> +<TR> + <TD ALIGN="right"> </TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address2" SIZE=70 VALUE="<%= $address2 %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>City</TH> + <TD><INPUT TYPE="text" NAME="city" VALUE="<%= $city %>"></TD> + <TH ALIGN="right"><font color="#ff0000">*</font>State/Country</TH> + <TD><SELECT NAME="state" SIZE="1"> + + <%= + foreach ( @{$locales} ) { + my $value = $_->{'state'}; + $value .= ' ('. $_->{'county'}. ')' if $_->{'county'}; + $value .= ' / '. $_->{'country'}; + + $OUT .= qq(<OPTION VALUE="$value"); + $OUT .= ' SELECTED' if ( $state eq $_->{'state'} + && $county eq $_->{'county'} + && $country eq $_->{'country'} + ); + $OUT .= ">$value</OPTION>"; + } + %> + + </SELECT></TD> + <TH><font color="#ff0000">*</font>Zip</TH> + <TD><INPUT TYPE="text" NAME="zip" SIZE=10 VALUE="<%= $zip %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="daytime" VALUE="<%= $daytime %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="night" VALUE="<%= $night %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="<%= $fax %>" SIZE=12></TD> +</TR> +</TABLE><font color="#ff0000">*</font> required fields<BR> + +<BR><BR> +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Username</TH> + <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Password</TH> + <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Re-enter Password</TH> + <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>"></TD> +</TR> + +<%= if ( $init_data->{'security_phrase'} ) { + <<ENDOUT; +<TR> + <TD ALIGN="right">Security Phrase</TD> + <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase"> + </TD> +</TR> +ENDOUT + } else { + '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">'; + } +%> + +<%= if ( scalar(@$pops) ) { + '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector($popnum). '</TD></TR>'; + } else { + popselector($popnum); + } +%> + +</TABLE><font color="#ff0000">*</font> required fields + +<BR><BR>First package + + <%= use Tie::IxHash; + my %pkgpart2payby = map { $_->{pkgpart} => $_->{payby}[0] } @{$packages}; + tie my %options, 'Tie::IxHash', + '' => '(none)', + map { $_->{pkgpart} => $_->{pkg} } + sort { $a->{recur} <=> $b->{recur} } + @{$packages} + ; + + use HTML::Widgets::SelectLayers 0.02; + my @form_text = qw( magic ref ss agentnum + last first company address1 address2 + city zip daytime night fax + username _password _password2 sec_phrase ); + my @form_select = qw( state ); #county country + if ( scalar(@$pops) == 0 or scalar(@$pops) == 1 ) { + push @form_text, 'popnum', + } else { + push @form_select, 'popnum', + } + my $widget = new HTML::Widgets::SelectLayers( + options => \%options, + selected_layer => $pkgpart, + form_name => 'dummy', + form_action => $self_url, + form_text => \@form_text, + form_select => \@form_select, + layer_callback => sub { + my $layer = shift; + my $html = qq( <INPUT TYPE="hidden" NAME="pkgpart" VALUE="$layer">); + + if ( $pkgpart2payby{$layer} eq 'BILL' ) { + $html .= <<ENDOUT; +<INPUT TYPE="hidden" NAME="payby" VALUE="BILL"> +<INPUT TYPE="hidden" NAME="invoicing_list_POST" VALUE=""> +<INPUT TYPE="hidden" NAME="BILL_payinfo" VALUE=""> +<INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"> +<INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037"> +<INPUT TYPE="hidden" NAME="BILL_payname" VALUE=""> +<BR><BR><INPUT TYPE="submit" VALUE="Signup"> +ENDOUT + } elsif ( $pkgpart2payby{$layer} eq 'CARD' ) { + my $postal_checked = ''; + my @invoicing_list = split(', ', $invoicing_list ); + $postal_checked = 'CHECKED' + if ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list; + + $invoicing_list= join(', ', grep { $_ ne 'POST' } @invoicing_list ); + + my $expselect = expselect("CARD", $paydate); + + my $cardselect = '<SELECT NAME="CARD_type"><OPTION></OPTION>'; + my %types = ( + 'VISA' => 'VISA card', + 'MasterCard' => 'MasterCard', + 'Discover' => 'Discover card', + 'American Express' => 'American Express card', + ); + foreach ( keys %types ) { + $selected = + $cgi->param('CARD_type') eq $types{$_} ? 'SELECTED' : ''; + $cardselect .= + qq!<OPTION $selected VALUE="$types{$_}">$_</OPTION>!; + } + $cardselect .= '</SELECT>'; + + $html .= <<ENDOUT; +<INPUT TYPE="hidden" NAME="payby" VALUE="CARD"> +<BR><BR>Billing information +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0> +<INPUT TYPE="hidden" NAME="invoicing_list_POST" VALUE=""> +<TR> + <TD ALIGN="right">Email statement to </TD> + <TD><INPUT TYPE="text" NAME="invoicing_list" VALUE="$invoicing_list"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Credit card type</TH> + <TD>$cardselect</TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Card number</TH> + <TD><INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>*</font>Exp</TH> + <TD>$expselect</TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Name on card</TH> + <TD><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname"></TD> +</TR> +</TABLE> +<font color="#ff0000">*</font> required fields +<BR><BR><INPUT TYPE="submit" VALUE="Signup"> +ENDOUT + } else { + $html = <<ENDOUT; +<BR>Please select a package.<BR> +ENDOUT + + } + + $html; + + }, + ); + + $widget->html; + + + %> +</BODY></HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/signup-billaddress.html b/fs_selfservice/FS-SelfService/cgi/signup-billaddress.html new file mode 100755 index 000000000..3cf9d2505 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/signup-billaddress.html @@ -0,0 +1,307 @@ +<HTML><HEAD><TITLE>ISP Signup form</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8" onUnload="myclose()"> +<script language="JavaScript"><!-- + var mywindow = -1; + function myopen(filename,windowname,properties) { + myclose(); + mywindow = window.open(filename,windowname,properties); + } + function myclose() { + if ( mywindow != -1 ) + mywindow.close(); + mywindow = -1 + } +//--></script> +<FONT SIZE=7>ISP Signup form</FONT><BR><BR> +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> +<FORM NAME="OneTrueForm" ACTION="<%= $self_url %>" METHOD=POST onSubmit="document.OneTrueForm.signup.disabled=true"> +<INPUT TYPE="hidden" NAME="magic" VALUE="process"> +<INPUT TYPE="hidden" NAME="ref" VALUE="<%= $referral_custnum %>"> +<INPUT TYPE="hidden" NAME="ss" VALUE=""> +Where did you hear about our service? <SELECT NAME="refnum"> +<%= + $OUT .= '<OPTION VALUE="">' unless $refnum; + foreach my $part_referral ( @{$init_data->{'part_referral'}} ) { + $OUT .= '<OPTION VALUE="'. $part_referral->{'refnum'}. '"'; + $OUT .= ' SELECTED' if $part_referral->{'refnum'} eq $refnum; + $OUT .= '>'. $part_referral->{'referral'}; + } +%> +</SELECT><BR><BR> +Billing Address (where credit card statement is sent) +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Exact name on card<BR>(last, first)</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="last" VALUE="<%= $last %>" onChange="changed(this)">, + <INPUT TYPE="text" NAME="first" VALUE="<%= $first %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="company" SIZE=70 VALUE="<%= $company %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Address</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address1" SIZE=70 VALUE="<%= $address1 %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right"> </TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address2" SIZE=70 VALUE="<%= $address2 %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>City</TH> + <TD><INPUT TYPE="text" NAME="city" VALUE="<%= $city %>" onChange="changed(this)"></TD> + <TH ALIGN="right"><font color="#ff0000">*</font>State/Country</TH> + <TD> + <%= + ($county_html, $state_html, $country_html) = + regionselector( $county, $state, $country, '', 'changed(this)' ); + + "$county_html $state_html"; + %> + </TD> + <TH><font color="#ff0000">*</font>Zip</TH> + <TD><INPUT TYPE="text" NAME="zip" SIZE=10 VALUE="<%= $zip %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Country</TH> + <TD><%= $country_html %></TD> +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="daytime" VALUE="<%= $daytime %>" SIZE=18 onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="night" VALUE="<%= $night %>" SIZE=18 onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="<%= $fax %>" SIZE=12 onChange="changed(this)"></TD> +</TR> +</TABLE> + +<SCRIPT> +function changed(what) { + what.form.same.checked = false; +} +function samechanged(what) { + if ( what.checked ) { + + <%= foreach (qw( + last first company address1 address2 city zip daytime night fax + )) { + $OUT .= "what.form.ship_$_.value = what.form.$_.value;\n"; + } + %> + + what.form.ship_country.selectedIndex = what.form.country.selectedIndex; + ship_country_changed(what.form.ship_country); + what.form.ship_state.selectedIndex = what.form.state.selectedIndex; + ship_state_changed(what.form.ship_state); + what.form.ship_county.selectedIndex = what.form.county.selectedIndex; + } +} +</SCRIPT> + +<BR><BR> +Service Address +(<INPUT TYPE="checkbox" NAME="same" VALUE="Y" onClick="samechanged(this)" <%= $same eq 'Y' ? 'CHECKED' : '' %>>same as billing address)<BR> +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Contact name<BR>(last, first)</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="ship_last" VALUE="<%= $ship_last %>" onChange="changed(this)">, + <INPUT TYPE="text" NAME="ship_first" VALUE="<%= $ship_first %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="ship_company" SIZE=70 VALUE="<%= $ship_company %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Address</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="ship_address1" SIZE=70 VALUE="<%= $ship_address1 %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right"> </TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="ship_address2" SIZE=70 VALUE="<%= $ship_address2 %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>City</TH> + <TD><INPUT TYPE="text" NAME="ship_city" VALUE="<%= $ship_city %>" onChange="changed(this)"></TD> + <TH ALIGN="right"><font color="#ff0000">*</font>State/Country</TH> + <TD> + <%= + ($ship_county_html, $ship_state_html, $ship_country_html) = + regionselector( $ship_county, + $ship_state, + $ship_country, + 'ship_', + 'changed(this)', + ); + + "$ship_county_html $ship_state_html"; + %> + </TD> + <TH><font color="#ff0000">*</font>Zip</TH> + <TD><INPUT TYPE="text" NAME="ship_zip" SIZE=10 VALUE="<%= $ship_zip %>" onChange="changed(this)"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Country</TH> + <TD><%= $ship_country_html %></TD> +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="ship_daytime" VALUE="<%= $ship_daytime %>" SIZE=18 onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="ship_night" VALUE="<%= $ship_night %>" SIZE=18 onChange="changed(this)"></TD> +</TR> +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="ship_fax" VALUE="<%= $ship_fax %>" SIZE=12 onChange="changed(this)"></TD> +</TR> +</TABLE> + +<font color="#ff0000">*</font> required fields<BR> + +<BR>Billing information<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR><TD> + + <%= + $OUT .= '<INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST"'; + my @invoicing_list = split(', ', $invoicing_list ); + $OUT .= ' CHECKED' + if ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list; + $OUT .= '>'; + %> + + Postal mail invoice +</TD></TR> +<TR><TD>Email invoice <INPUT TYPE="text" NAME="invoicing_list" VALUE="<%= join(', ', grep { $_ ne 'POST' } split(', ', $invoicing_list ) ) %>"> +</TD></TR> +<%= scalar(@payby) > 1 ? '<TR><TD>Billing type</TD></TR>' : '' %> +</TABLE> +<TABLE BGCOLOR="#c0c0c0" BORDER=1 WIDTH="100%"> +<TR> + + <%= + + my $cardselect = '<SELECT NAME="CARD_type"><OPTION></OPTION>'; + my %types = ( + 'VISA' => 'VISA card', + 'MasterCard' => 'MasterCard', + 'Discover' => 'Discover card', + 'American Express' => 'American Express card', + ); + foreach ( keys %types ) { + $selected = $cgi->param('CARD_type') eq $types{$_} ? 'SELECTED' : ''; + $cardselect .= qq!<OPTION $selected VALUE="$types{$_}">$_</OPTION>!; + } + $cardselect .= '</SELECT>'; + + my %payby = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD"), #. qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD"), #. qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", "12-2037"). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="Accounts Payable">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("COMP"), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="" MAXLENGTH=80>!, + ); + + if ( $init_data->{'cvv_enabled'} ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $payby{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4>!; + } + } + + my( $account, $aba ) = split('@', $payinfo); + my %paybychecked = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD", $paydate), #. qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD", $paydate), #. qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="$payname">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", $paydate). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("COMP", $paydate), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="$payinfo" MAXLENGTH=80>!, + ); + + if ( $init_data->{'cvv_enabled'} ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $paybychecked{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4>!; + } + } + + for (@payby) { + if ( scalar(@payby) == 1) { + $OUT .= '<TD VALIGN=TOP>'. + qq!<INPUT TYPE="hidden" NAME="payby" VALUE="$_">!. + "$paybychecked{$_}</TD>"; + } else { + $OUT .= qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!; + if ($payby eq $_) { + $OUT .= qq! CHECKED> $paybychecked{$_}</TD>!; + } else { + $OUT .= qq!> $payby{$_}</TD>!; + } + + } + } + %> + +</TR></TABLE><font color="#ff0000">*</font> required fields for each billing type +<BR><BR>First package +<INPUT TYPE="hidden" NAME="promo_code" VALUE="<%= $cgi->param('promo_code') %>"> +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TD COLSPAN=2><SELECT NAME="pkgpart"> + + <%= + $OUT .= '<OPTION VALUE="">(none)' unless scalar(@$packages) == 1; + foreach my $package ( @{$packages} ) { + $OUT .= '<OPTION VALUE="'. $package->{'pkgpart'}. '"'; + $OUT .= ' SELECTED' + if ( $pkgpart && $package->{'pkgpart'} == $pkgpart ) + || scalar(@$packages) == 1; + $OUT .= '>'. $package->{'pkg'}; + } + %> + + </SELECT></TD> +</TR> +<TR> + <TD ALIGN="right">Username</TD> + <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Password</TD> + <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Re-enter Password</TD> + <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>"></TD> +</TR> +<%= + if ( $init_data->{'security_phrase'} ) { + $OUT .= <<ENDOUT; +<TR> + <TD ALIGN="right">Security Phrase</TD> + <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase"> + </TD> +</TR> +ENDOUT + } else { + $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">'; + } +%> +<%= + if ( scalar(@$pops) ) { + $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector($popnum). '</TD></TR>'; + } else { + $OUT .= popselector($popnum); + } +%> +</TABLE> +<BR><BR><INPUT TYPE="submit" NAME="signup" VALUE="Signup"> +</FORM></BODY></HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/signup-freeoption.html b/fs_selfservice/FS-SelfService/cgi/signup-freeoption.html new file mode 100755 index 000000000..40ad03c0b --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/signup-freeoption.html @@ -0,0 +1,262 @@ +<HTML><HEAD><TITLE>ISP Signup form</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8" onUnload="myclose()"> +<script language="JavaScript"><!-- + var mywindow = -1; + function myopen(filename,windowname,properties) { + myclose(); + mywindow = window.open(filename,windowname,properties); + } + function myclose() { + if ( mywindow != -1 ) + mywindow.close(); + mywindow = -1 + } +//--></script> +<FONT SIZE=7>ISP Signup form</FONT><BR><BR> +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> +<FORM NAME="OneTrueForm" ACTION="<%= $self_url %>" METHOD=POST onSubmit="document.OneTrueForm.signup.disabled=true"> +<INPUT TYPE="hidden" NAME="magic" VALUE="process"> +<INPUT TYPE="hidden" NAME="ref" VALUE="<%= $referral_custnum %>"> +<INPUT TYPE="hidden" NAME="ss" VALUE=""> +Where did you hear about our service? <SELECT NAME="refnum"> +<%= + $OUT .= '<OPTION VALUE="">' unless $refnum; + foreach my $part_referral ( @{$init_data->{'part_referral'}} ) { + $OUT .= '<OPTION VALUE="'. $part_referral->{'refnum'}. '"'; + $OUT .= ' SELECTED' if $part_referral->{'refnum'} eq $refnum; + $OUT .= '>'. $part_referral->{'referral'}; + } +%> +</SELECT><BR><BR> +Contact Information +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Contact name<BR>(last, first)</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="last" VALUE="<%= $last %>">, + <INPUT TYPE="text" NAME="first" VALUE="<%= $first %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="company" SIZE=70 VALUE="<%= $company %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Address</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address1" SIZE=70 VALUE="<%= $address1 %>"></TD> +</TR> +<TR> + <TD ALIGN="right"> </TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address2" SIZE=70 VALUE="<%= $address2 %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>City</TH> + <TD><INPUT TYPE="text" NAME="city" VALUE="<%= $city %>"></TD> + <TH ALIGN="right"><font color="#ff0000">*</font>State/Country</TH> + <TD> + <%= + ($county_html, $state_html, $country_html) = + regionselector( $county, $state, $country ); + + "$county_html $state_html"; + %> + </TD> + <TH><font color="#ff0000">*</font>Zip</TH> + <TD><INPUT TYPE="text" NAME="zip" SIZE=10 VALUE="<%= $zip %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Country</TH> + <TD><%= $country_html %></TD> +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="daytime" VALUE="<%= $daytime %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="night" VALUE="<%= $night %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="<%= $fax %>" SIZE=12></TD> +</TR> +</TABLE><font color="#ff0000">*</font> required fields<BR> +<BR> +<%= + my $first_payby = $packages->[0]{'payby'}[0]; + unless ( grep { scalar( @{$_->{'payby'}} ) > 1 + || $_->{'payby'}->[0] ne $first_payby + } @$packages + ) { + @payby = ( $first_payby ); + } + + unless ( scalar(@payby) == 1 && $payby[0] eq 'BILL' ) { + + $OUT .= ' Billing information + <TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> + <TR><TD> + <INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST"'; + + my @invoicing_list = split(', ', $invoicing_list ); + + $OUT .= ' CHECKED' + if ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list; + + $OUT .= '> Postal mail invoice + </TD></TR> + <TR><TD>Email invoice + <INPUT TYPE="text" NAME="invoicing_list" VALUE="' + .join(', ', grep { $_ ne 'POST' } split(', ', $invoicing_list ) ). + '"></TD></TR>'; + + $OUT .= '<TR><TD>Billing type</TD></TR>' + if scalar(@payby) > 1; + + $OUT .= '</TABLE>'; + + } else { + $OUT .= '<INPUT TYPE="hidden" NAME="invoicing_list" VALUE=""> + <INPUT TYPE="hidden" NAME="invoicing_list_POST" VALUE="">'; + } + +%> + +<TABLE BGCOLOR="#c0c0c0" BORDER=1 WIDTH="100%"> +<TR> + + <%= + + my $cardselect = '<SELECT NAME="CARD_type"><OPTION></OPTION>'; + my %types = ( + 'VISA' => 'VISA card', + 'MasterCard' => 'MasterCard', + 'Discover' => 'Discover card', + 'American Express' => 'American Express card', + ); + foreach ( keys %types ) { + $selected = $cgi->param('CARD_type') eq $types{$_} ? 'SELECTED' : ''; + $cardselect .= qq!<OPTION $selected VALUE="$types{$_}">$_</OPTION>!; + } + $cardselect .= '</SELECT>'; + + my %payby = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => <<'END', +<INPUT TYPE="hidden" NAME="BILL_payinfo" VALUE=""> +<INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"> +<INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037"> +<INPUT TYPE="hidden" NAME="BILL_payname" VALUE=""> +END + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("COMP"), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="" MAXLENGTH=80>!, + ); + + if ( $init_data->{'cvv_enabled'} ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $payby{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4>!; + } + } + + my( $account, $aba ) = split('@', $payinfo); + my %paybychecked = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="$payname">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => <<'END', +<INPUT TYPE="hidden" NAME="BILL_payinfo" VALUE=""> +<INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"> +<INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037"> +<INPUT TYPE="hidden" NAME="BILL_payname" VALUE=""> +END + + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("COMP", $paydate), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="$payinfo" MAXLENGTH=80>!, + ); + + if ( $init_data->{'cvv_enabled'} ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $paybychecked{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4>!; + } + } + + for (@payby) { + if ( scalar(@payby) == 1) { + $OUT .= '<TD VALIGN=TOP>'. + qq!<INPUT TYPE="hidden" NAME="payby" VALUE="$_">!. + "$paybychecked{$_}</TD>"; + } else { + $OUT .= qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!; + if ($payby eq $_) { + $OUT .= qq! CHECKED> $paybychecked{$_}</TD>!; + } else { + $OUT .= qq!> $payby{$_}</TD>!; + } + + } + } + %> + +</TR></TABLE> +<%= unless ( scalar(@payby) == 1 && $payby[0] eq 'BILL' ) { + $OUT .= '<font color="#ff0000">*</font> required fields for each billing type'; + } + ''; +%> +<BR><BR>First package +<INPUT TYPE="hidden" NAME="promo_code" VALUE="<%= $cgi->param('promo_code') %>"><TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TD COLSPAN=2><SELECT NAME="pkgpart"> + + <%= + $OUT .= '<OPTION VALUE="">(none)' unless scalar(@$packages) == 1; + foreach my $package ( @{$packages} ) { + $OUT .= '<OPTION VALUE="'. $package->{'pkgpart'}. '"'; + $OUT .= ' SELECTED' + if ( $pkgpart && $package->{'pkgpart'} == $pkgpart ) + || scalar(@$packages) == 1; + $OUT .= '>'. $package->{'pkg'}; + } + %> + + </SELECT></TD> +</TR> +<TR> + <TD ALIGN="right">Username</TD> + <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Password</TD> + <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Re-enter Password</TD> + <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>"></TD> +</TR> +<%= + if ( $init_data->{'security_phrase'} ) { + $OUT .= <<ENDOUT; +<TR> + <TD ALIGN="right">Security Phrase</TD> + <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase"> + </TD> +</TR> +ENDOUT + } else { + $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">'; + } +%> +<%= + if ( scalar(@$pops) ) { + $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector($popnum). '</TD></TR>'; + } else { + $OUT .= popselector($popnum); + } +%> +</TABLE> +<BR><BR><INPUT TYPE="submit" NAME="signup" VALUE="Signup"> +</FORM></BODY></HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/signup-snarf.html b/fs_selfservice/FS-SelfService/cgi/signup-snarf.html new file mode 100755 index 000000000..d167efbf9 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/signup-snarf.html @@ -0,0 +1,228 @@ +<HTML><HEAD><TITLE>ISP Signup form</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8" onUnload="myclose()"> +<script language="JavaScript"><!-- + var mywindow = -1; + function myopen(filename,windowname,properties) { + myclose(); + mywindow = window.open(filename,windowname,properties); + } + function myclose() { + if ( mywindow != -1 ) + mywindow.close(); + mywindow = -1 + } +//--></script> +<FONT SIZE=7>ISP Signup form</FONT><BR><BR> +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> +<FORM ACTION="<%= $self_url %>" METHOD=POST> +<INPUT TYPE="hidden" NAME="magic" VALUE="process"> +<INPUT TYPE="hidden" NAME="ref" VALUE="<%= $referral_custnum %>"> +<INPUT TYPE="hidden" NAME="ss" VALUE=""> +Contact Information +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Contact name<BR>(last, first)</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="last" VALUE="<%= $last %>">, + <INPUT TYPE="text" NAME="first" VALUE="<%= $first %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="company" SIZE=70 VALUE="<%= $company %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Address</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address1" SIZE=70 VALUE="<%= $address1 %>"></TD> +</TR> +<TR> + <TD ALIGN="right"> </TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address2" SIZE=70 VALUE="<%= $address2 %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>City</TH> + <TD><INPUT TYPE="text" NAME="city" VALUE="<%= $city %>"></TD> + <TH ALIGN="right"><font color="#ff0000">*</font>State/Country</TH> + <TD> + <%= + ($county_html, $state_html, $country_html) = + regionselector( $county, $state, $country ); + + "$county_html $state_html"; + %> + </TD> + <TH><font color="#ff0000">*</font>Zip</TH> + <TD><INPUT TYPE="text" NAME="zip" SIZE=10 VALUE="<%= $zip %>"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Country</TH> + <TD><%= $country_html %></TD> +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="daytime" VALUE="<%= $daytime %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="night" VALUE="<%= $night %>" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="<%= $fax %>" SIZE=12></TD> +</TR> +</TABLE><font color="#ff0000">*</font> required fields<BR> +<BR>Billing information<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR><TD> + + <%= + $OUT .= '<INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST"'; + my @invoicing_list = split(', ', $invoicing_list ); + $OUT .= ' CHECKED' + if ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list; + $OUT .= '>'; + %> + + Postal mail invoice +</TD></TR> +<TR><TD>Email invoice <INPUT TYPE="text" NAME="invoicing_list" VALUE="<%= join(', ', grep { $_ ne 'POST' } split(', ', $invoicing_list ) ) %>"> +</TD></TR> +<%= scalar(@payby) > 1 ? '<TR><TD>Billing type</TD></TR>' : '' %> +</TABLE> +<TABLE BGCOLOR="#c0c0c0" BORDER=1 WIDTH="100%"> +<TR> + + <%= + + my $cardselect = '<SELECT NAME="CARD_type"><OPTION></OPTION>'; + my %types = ( + 'VISA' => 'VISA card', + 'MasterCard' => 'MasterCard', + 'Discover' => 'Discover card', + 'American Express' => 'American Express card', + ); + foreach ( keys %types ) { + $selected = $cgi->param('CARD_type') eq $types{$_} ? 'SELECTED' : ''; + $cardselect .= qq!<OPTION $selected VALUE="$types{$_}">$_</OPTION>!; + } + $cardselect .= '</SELECT>'; + + my %payby = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", "12-2037"). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="Accounts Payable">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("COMP"), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="" MAXLENGTH=80>!, + ); + + if ( $init_data->{'cvv_enabled'} ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $payby{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4>!; + } + } + + my( $account, $aba ) = split('@', $payinfo); + my %paybychecked = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="$payname">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", $paydate). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("COMP", $paydate), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="$payinfo" MAXLENGTH=80>!, + ); + + if ( $init_data->{'cvv_enabled'} ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $paybychecked{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4>!; + } + } + + for (@payby) { + if ( scalar(@payby) == 1) { + $OUT .= '<TD VALIGN=TOP>'. + qq!<INPUT TYPE="hidden" NAME="payby" VALUE="$_">!. + "$paybychecked{$_}</TD>"; + } else { + $OUT .= qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!; + if ($payby eq $_) { + $OUT .= qq! CHECKED> $paybychecked{$_}</TD>!; + } else { + $OUT .= qq!> $payby{$_}</TD>!; + } + + } + } + %> + +</TR></TABLE><font color="#ff0000">*</font> required fields for each billing type +<BR><BR>First package +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TD COLSPAN=2><SELECT NAME="pkgpart"><OPTION VALUE="">(none) + + <%= + foreach my $package ( @{$packages} ) { + $OUT .= '<OPTION VALUE="'. $package->{'pkgpart'}. '"'; + $OUT .= ' SELECTED' if $pkgpart && $package->{'pkgpart'} == $pkgpart; + $OUT .= '>'. $package->{'pkg'}; + } + %> + + </SELECT></TD> +</TR> +<TR> + <TD ALIGN="right">Username</TD> + <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Password</TD> + <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Re-enter Password</TD> + <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>"></TD> +</TR> +<%= + if ( $init_data->{'security_phrase'} ) { + $OUT .= <<ENDOUT; +<TR> + <TD ALIGN="right">Security Phrase</TD> + <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase"> + </TD> +</TR> +ENDOUT + } else { + $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">'; + } +%> +<%= + if ( scalar(@$pops) ) { + $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector($popnum). '</TD></TR>'; + } else { + $OUT .= popselector($popnum); + } +%> +</TABLE> +<BR><BR>Enter up to ten external accounts from which to retrieve email +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="left">Mail server</TH> + <TH ALIGN="left">Username</TH> + <TH ALIGN="left">Password</TH> +</TR> +<%= + for my $num ( 1..10 ) { + no strict 'vars'; + $OUT .= qq!<TR><TD><INPUT TYPE="text" NAME="snarf_machine$num" VALUE="${"snarf_machine$num"}"></TD>!. + qq!<INPUT TYPE="hidden" NAME="snarf_protocol$num" VALUE="pop3">!. + qq!<TD><INPUT TYPE="text" NAME="snarf_username$num" VALUE="${"snarf_username$num"}"></TD>!. + qq!<TD><INPUT TYPE="password" NAME="snarf_password$num" VALUE="${"snarf_password$num"}"></TD>!. + qq!</TR>!; + } +%> +</TABLE> + +<BR><BR><INPUT TYPE="submit" VALUE="Signup"> +</FORM></BODY></HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/signup.cgi b/fs_selfservice/FS-SelfService/cgi/signup.cgi new file mode 100755 index 000000000..200161404 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/signup.cgi @@ -0,0 +1,494 @@ +#!/usr/bin/perl -T +#!/usr/bin/perl -Tw + +use strict; +use vars qw( @payby $cgi $init_data + $self_url $error $agentnum + + $ieak_file $ieak_template + $signup_html $signup_template + $success_html $success_template + $collect_html $collect_template + $decline_html $decline_template + ); + +use subs qw( print_form print_okay print_decline + success_default collect_default decline_default + ); +use CGI; +#use CGI::Carp qw(fatalsToBrowser); +use Tie::IxHash; +use Text::Template; +use Business::CreditCard; +use HTTP::BrowserDetect; +use HTML::Widgets::SelectLayers; +use FS::SelfService qw( signup_info new_customer ); + +#acceptable payment methods +# +#@payby = qw( CARD BILL COMP ); +#@payby = qw( CARD BILL ); +#@payby = qw( CARD ); +@payby = qw( CARD PREPAY ); + +$ieak_file = '/usr/local/freeside/ieak.template'; +$signup_html = -e 'signup.html' + ? 'signup.html' + : '/usr/local/freeside/signup.html'; +$success_html = -e 'success.html' + ? 'success.html' + : '/usr/local/freeside/success.html'; +$collect_html = -e 'collect.html' + ? 'collect.html' + : '/usr/local/freeside/collect.html'; +$decline_html = -e 'decline.html' + ? 'decline.html' + : '/usr/local/freeside/decline.html'; + + +if ( -e $ieak_file ) { + my $ieak_txt = Text::Template::_load_text($ieak_file) + or die $Text::Template::ERROR; + $ieak_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $ieak_txt = $1; + $ieak_txt =~ s/\r//g; # don't double \r on old templates + $ieak_txt =~ s/\n/\r\n/g; + $ieak_template = new Text::Template ( TYPE => 'STRING', SOURCE => $ieak_txt ) + or die $Text::Template::ERROR; +} else { + $ieak_template = ''; +} + +$agentnum = ''; +if ( -e $signup_html ) { + my $signup_txt = Text::Template::_load_text($signup_html) + or die $Text::Template::ERROR; + $signup_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $signup_txt = $1; + $signup_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $signup_txt, + DELIMITERS => [ '<%=', '%>' ] + ) + or die $Text::Template::ERROR; + if ( $signup_txt =~ + /<\s*INPUT TYPE="?hidden"?\s+NAME="?agentnum"?\s+VALUE="?(\d+)"?\s*\/?\s*>/si + ) { + $agentnum = $1; + } +} else { + #too much maintenance hassle to keep in this file + die "can't find ./signup.html or /usr/local/freeside/signup.html"; + #$signup_template = new Text::Template ( TYPE => 'STRING', + # SOURCE => &signup_default, + # DELIMITERS => [ '<%=', '%>' ] + # ) + # or die $Text::Template::ERROR; +} + +if ( -e $success_html ) { + my $success_txt = Text::Template::_load_text($success_html) + or die $Text::Template::ERROR; + $success_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $success_txt = $1; + $success_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $success_txt, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} else { + $success_template = new Text::Template ( TYPE => 'STRING', + SOURCE => &success_default, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} + +if ( -e $collect_html ) { + my $collect_txt = Text::Template::_load_text($collect_html) + or die $Text::Template::ERROR; + $collect_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $collect_txt = $1; + $collect_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $collect_txt, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} else { + $collect_template = new Text::Template ( TYPE => 'STRING', + SOURCE => &collect_default, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} + +if ( -e $decline_html ) { + my $decline_txt = Text::Template::_load_text($decline_html) + or die $Text::Template::ERROR; + $decline_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $decline_txt = $1; + $decline_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $decline_txt, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} else { + $decline_template = new Text::Template ( TYPE => 'STRING', + SOURCE => &decline_default, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} + +$cgi = new CGI; + +$init_data = signup_info( 'agentnum' => $agentnum || scalar($cgi->param('agentnum')), + 'promo_code' => scalar($cgi->param('promo_code')), + 'reg_code' => uc(scalar($cgi->param('reg_code'))), + ); + +my $magic = $cgi->param('magic') || ''; +my $action = $cgi->param('action') || ''; + +if ( $magic eq 'process' || $action eq 'process_signup' ) { + + $error = ''; + + $cgi->param('agentnum', $agentnum) if $agentnum; + $cgi->param('reg_code', uc(scalar($cgi->param('reg_code'))) ); + + #false laziness w/agent.cgi, identical except for agentnum + my $payby = $cgi->param('payby'); + if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) { + #$payinfo = join('@', map { $cgi->param( $payby. "_payinfo$_" ) } (1,2) ); + $cgi->param('payinfo' => $cgi->param($payby. '_payinfo1'). '@'. + $cgi->param($payby. '_payinfo2') + ); + } else { + $cgi->param('payinfo' => $cgi->param( $payby. '_payinfo' ) ); + } + $cgi->param('paydate' => $cgi->param( $payby. '_month' ). '-'. + $cgi->param( $payby. '_year' ) + ); + $cgi->param('payname' => $cgi->param( $payby. '_payname' ) ); + $cgi->param('paycvv' => defined $cgi->param( $payby. '_paycvv' ) + ? $cgi->param( $payby. '_paycvv' ) + : '' + ); + $cgi->param('paytype' => defined $cgi->param( $payby. '_paytype' ) + ? $cgi->param( $payby. '_paytype' ) + : '' + ); + $cgi->param('paystate' => defined $cgi->param( $payby. '_paystate' ) + ? $cgi->param( $payby. '_paystate' ) + : '' + ); + + if ( $cgi->param('invoicing_list') ) { + $cgi->param('invoicing_list' => $cgi->param('invoicing_list'). ', POST') + if $cgi->param('invoicing_list_POST'); + } else { + $cgi->param('invoicing_list' => 'POST' ); + } + + #if ( $svc_x eq 'svc_acct' ) { + if ( $cgi->param('_password') ne $cgi->param('_password2') ) { + $error = $init_data->{msgcat}{passwords_dont_match}; #msgcat + $cgi->param('_password', ''); + $cgi->param('_password2', ''); + } + + if ( $payby =~ /^(CARD|DCRD)$/ && $cgi->param('CARD_type') ) { + my $payinfo = $cgi->param('payinfo'); + $payinfo =~ s/\D//g; + + $payinfo =~ /^(\d{13,16})$/ + or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + $payinfo = $1; + validate($payinfo) + or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + cardtype($payinfo) eq $cgi->param('CARD_type') + or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type'); + } + + if ($init_data->{emailinvoiceonly} && (length $cgi->param('invoicing_list') < 1)) { + $error ||= $init_data->{msgcat}{illegal_or_empty_text}; + } + + my $rv = ''; + unless ( $error ) { + $rv = new_customer( { + ( map { $_ => scalar($cgi->param($_)) } + qw( last first ss company + address1 address2 city county state zip country + daytime night fax stateid stateid_state + + ship_last ship_first ship_company + ship_address1 ship_address2 ship_city ship_county ship_state + ship_zip ship_country + ship_daytime ship_night ship_fax + + payby payinfo paycvv paydate payname paystate paytype + invoicing_list referral_custnum promo_code reg_code + pkgpart refnum agentnum + username sec_phrase _password popnum + mac_addr + countrycode phonenum sip_password pin prepaid_shortform + ), + grep { /^snarf_/ } $cgi->param + ), + 'payip' => $cgi->remote_host(), + } ); + $error = $rv->{'error'}; + } + #eslaf + + if ( $error eq '_decline' ) { + print_decline(); + } elsif ( $error eq '_collect' ) { + map { $cgi->param($_, $rv->{$_}) } + qw( popup_url reference amount ); + print_collect($rv); + } elsif ( $error ) { + #fudge the snarf info + no strict 'refs'; + ${$_} = $cgi->param($_) foreach grep { /^snarf_/ } $cgi->param; + print_form(); + } else { + print_okay( + 'pkgpart' => scalar($cgi->param('pkgpart')), + %$rv, + ); + } + +} elsif ( $magic eq 'success' || $action eq 'success' ) { + + $cgi->param('username', 'username'); #hmmm temp kludge + $cgi->param('_password', 'password'); + print_okay( map { /^([\w ]+)$/ ? ( $_ => $1 ) : () } $cgi->param ); #hmmm + +} elsif ( $magic eq 'decline' || $action eq 'decline' ) { + + print_decline(); + +} else { + $error = ''; + print_form; +} + +sub print_form { + + $error = "Error: $error" if $error; + + my $r = { + $cgi->Vars, + %{$init_data}, + 'error' => $error, + }; + + $r->{pkgpart} ||= $r->{default_pkgpart}; + + $r->{referral_custnum} = $r->{'ref'}; + #$cgi->delete('ref'); + #$cgi->delete('init_popstate'); + $r->{self_url} = $cgi->self_url; + + $r->{prepaid_shortform} = $cgi->param('prepaid_shortform'); + + print $cgi->header( '-expires' => 'now' ), + $signup_template->fill_in( PACKAGE => 'FS::SelfService::_signupcgi', + HASH => $r + ); +} + +sub print_collect { + + $error = "Error: $error" if $error; + + my $rv = shift || {}; + my $r = { + $cgi->Vars, + %{$init_data}, + %$rv, + 'error' => $error, + }; + + $r->{pkgpart} ||= $r->{default_pkgpart}; + + $r->{referral_custnum} = $r->{'ref'}; + $r->{self_url} = $cgi->self_url; + + print $cgi->header( '-expires' => 'now' ), + + $collect_template->fill_in( PACKAGE => 'FS::SelfService::_signupcgi', + HASH => $r + ); +} + +sub print_decline { + my $r = { + %{$init_data}, + }; + + print $cgi->header( '-expires' => 'now' ), + $decline_template->fill_in( PACKAGE => 'FS::SelfService::_signupcgi', + HASH => $r + ); +} + +sub print_okay { + my %param = @_; + my $user_agent = new HTTP::BrowserDetect $ENV{HTTP_USER_AGENT}; + + my( $username, $password ) = ( '', '' ); + my( $countrycode, $phonenum, $sip_password, $pin ) = ( '', '', '', '' ); + + my $svc_x = $param{signup_service} || 'svc_acct'; #just in case + if ( $svc_x eq 'svc_acct' ) { + + $cgi->param('username') =~ /^(.+)$/ + or die "fatal: invalid username got past FS::SelfService::new_customer"; + $username = $1; + $cgi->param('_password') =~ /^(.+)$/ + or die "fatal: invalid password got past FS::SelfService::new_customer"; + $password = $1; + + } elsif ( $svc_x eq 'svc_phone' ) { + + $countrycode = $param{countrycode}; + $phonenum = $param{phonenum}; + $sip_password = $param{sip_password}; + $pin = $param{pin}; + + } else { + die "unknown signup service $svc_x"; + } + + ( $cgi->param('first'). ' '. $cgi->param('last') ) =~ /^(.*)$/ + or die "fatal: invalid email_name got past FS::SelfService::new_customer"; + my $email_name = $1; #global for template + + #my %pop = (); + my %popnum2pop = (); + foreach ( @{ $init_data->{'svc_acct_pop'} } ) { + #push @{ $pop{ $_->{state} }->{ $_->{ac} } }, $_; + $popnum2pop{$_->{popnum}} = $_; + } + + my( $ac, $exch, $loc); + my $pop = $popnum2pop{$cgi->param('popnum')}; + #or die "fatal: invalid popnum got past FS::SelfService::new_customer"; + if ( $pop ) { + ( $ac, $exch, $loc ) = ( $pop->{'ac'}, $pop->{'exch'}, $pop->{'loc'} ); + } else { + ( $ac, $exch, $loc ) = ( '', '', ''); #presumably you're not using them. + } + + #global for template + my $part_pkg = ( grep { $_->{'pkgpart'} eq $param{'pkgpart'} } + @{ $init_data->{'part_pkg'} } + )[0]; + my $pkg = $part_pkg->{'pkg'}; + + if ( $ieak_template && $user_agent->windows && $user_agent->ie ) { + + #send an IEAK config + print $cgi->header('application/x-Internet-signup'), + $ieak_template->fill_in(); + + } else { #send a simple confirmation + + print $cgi->header( '-expires' => 'now' ), + $success_template->fill_in( HASH => { + + %{$init_data}, + + email_name => $email_name, + pkg => $pkg, + part_pkg => \$part_pkg, + + signup_service => $svc_x, + + #for svc_acct + username => $username, + password => $password, + _password => $password, + ac => $ac, #for dialup POP + exch => $exch, # + loc => $loc, # + + #for svc_phone + countrycode => $countrycode, + phonenum => $phonenum, + sip_password => $sip_password, + pin => $pin, + + }); + } + +} + +sub success_default { #html to use if you don't specify a success file + <<'END'; +<HTML><HEAD><TITLE>Signup successful</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Signup successful</FONT><BR><BR> +Thanks for signing up! +<BR><BR> +Signup information for <%= $email_name %>: +<BR><BR> +Username: <%= $username %><BR> +Password: <%= $password %><BR> +Access number: (<%= $ac %>) / <%= $exch %> - <%= $local %><BR> +Package: <%= $pkg %><BR> +</BODY></HTML> +END +} + +sub collect_default { #html to use if there is a collect phase + <<'END'; +<HTML><HEAD><TITLE>Pay now</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Pay now</FONT><BR><BR> +<%= +#<SCRIPT TYPE="text/javascript"> +# function popcollect() { +# overlib( OLiframeContent('<%= $popup_url %>', 336, 550, 'Secure Payment Area', 0, 'auto' ), CAPTION, 'Pay now', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, DRAGGABLE, CLOSECLICK, BGCOLOR, '#333399', CGCOLOR, '#333399', CLOSETEXT, 'Close' ); +# return false; +# } +#</SCRIPT> +#<SCRIPT TYPE="text/javascript" SRC="overlibmws.js"></SCRIPT> +#<SCRIPT TYPE="text/javascript" SRC="overlibmws_iframe.js"></SCRIPT> +#<SCRIPT TYPE="text/javascript" SRC="overlibmws_draggable.js"></SCRIPT> +#<SCRIPT TYPE="text/javascript" SRC="overlibmws_crossframe.js"></SCRIPT> +#<SCRIPT TYPE="text/javascript" SRC="iframecontentmws.js"></SCRIPT> +%> +You are about to contact our payment processor to pay <%= $amount %> for +<%= $pkg %>.<BR><BR> +Your transaction reference number is <%= $reference %><BR><BR> +<FORM NAME="collect_popper" method="post" action="<%= $popup_url %>"> +<%= + my %itemhash = @collectitems ; + foreach my $input (keys %itemhash) { + $OUT .= qq!<INPUT NAME="$input" TYPE="hidden" VALUE="$itemhash{$input}">!; + } +%> +<INPUT NAME="submit" type="submit" value="Pay now"> +</FORM> +</BODY></HTML> +END +} + +sub decline_default { #html to use if there is a decline + <<'END'; +<HTML><HEAD><TITLE>Processing error</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Processing error</FONT><BR><BR> +There has been an error processing your account. Please contact customer +support. +</BODY></HTML> +END +} + +# subs for the templates... + +package FS::SelfService::_signupcgi; +use HTML::Entities; +use FS::SelfService qw(regionselector expselect popselector didselector); + diff --git a/fs_selfservice/FS-SelfService/cgi/signup.html b/fs_selfservice/FS-SelfService/cgi/signup.html new file mode 100755 index 000000000..405444cfa --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/signup.html @@ -0,0 +1,448 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <TITLE><%= $agent || ( $signup_service eq 'svc_phone' ? 'ITSP' : 'ISP' ) %> Signup form</TITLE> + <%= $head %> +</HEAD> +<BODY BGCOLOR="<%= $body_bgcolor || '#e8e8e8' %>" onUnload="myclose()"> + +<script type="text/javascript"> + var mywindow = -1; + function myopen(filename,windowname,properties) { + myclose(); + mywindow = window.open(filename,windowname,properties); + } + function myclose() { + if ( mywindow != -1 ) + mywindow.close(); + mywindow = -1 + } +</script> + +<%= $OUT .= $body_header + || '<FONT SIZE=7>'. + ( $agent || ( $signup_service eq 'svc_phone' ? 'ITSP' : 'ISP' ) ). + ' Signup form</FONT><BR><BR>'; +%> + +<FONT SIZE="+1" COLOR="#ff0000"><%= $error %></FONT> + +<FORM NAME="OneTrueForm" ACTION="<%= $self_url %>" METHOD=POST onSubmit="document.OneTrueForm.signup.disabled=true"> +<INPUT TYPE="hidden" NAME="prepaid_shortform" VALUE="<%= $prepaid_shortform %>"> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_signup"> +<INPUT TYPE="hidden" NAME="agentnum" VALUE="<%= $agentnum %>"> +<INPUT TYPE="hidden" NAME="referral_custnum" VALUE="<%= $referral_custnum %>"> +<INPUT TYPE="hidden" NAME="ss" VALUE=""> +<input type="hidden" name="payby"> +<%= + $OUT = join("\n",map { my $method = $_ ; map { qq|<input type="hidden" name="${method}_$_" />| } qw / payinfo payinfo1 payinfo2 payname paystate paytype paycvv month year type / } @payby); +%> + +<%= + $OUT = join("\n", map { qq|<input type="hidden" name="$_" />| } qw / promo_code reg_code pkgpart username _password _password2 sec_phrase popnum mac_addr countrycode phonenum sip_password pin / ); +%> + +Where did you hear about our service? <SELECT NAME="refnum"> +<%= + $OUT .= '<OPTION VALUE="">' unless $refnum; + foreach my $part_referral ( @part_referral ) { + $OUT .= '<OPTION VALUE="'. $part_referral->{'refnum'}. '"'; + $OUT .= ' SELECTED' if $part_referral->{'refnum'} == $refnum; + $OUT .= '>'. $part_referral->{'referral'}; + } +%> +</SELECT><BR><BR> + +<%= unless ( $prepaid_template_custnum && $prepaid_shortform ) { + +my $bgcolor = $box_bgcolor || '#c0c0c0'; +$OUT .= qq! +Contact Information +<TABLE BGCOLOR="$bgcolor" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Contact name<BR>(last, first)</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="last" VALUE="$last">, + <INPUT TYPE="text" NAME="first" VALUE="$first"></TD> +</TR> +<TR> + <TD ALIGN="right">Company</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="company" SIZE=70 VALUE="$company"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Address</TH> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address1" SIZE=70 VALUE="$address1"></TD> +</TR> +<TR> + <TD ALIGN="right"> </TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="address2" SIZE=70 VALUE="$address2"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>City</TH> + <TD><INPUT TYPE="text" NAME="city" VALUE="$city"></TD> !; + + my ($county_html, $state_html, $country_html) = + regionselector( { + selected_county => $county, + selected_state => $state, + selected_country => $country, + default_state => $statedefault, + default_country => $countrydefault, + locales => \@cust_main_county, + } ); + +$county_out = ($county_html =~ /SELECT/) ? 'County/State' : 'State'; +$OUT .= qq!<TH ALIGN="right"><font color="#ff0000">*</font> $county_out </TH> + <TD> + $county_html $state_html + </TD> + <TH><font color="#ff0000">*</font>Zip</TH> + <TD><INPUT TYPE="text" NAME="zip" SIZE=10 VALUE="$zip"></TD> +</TR> +<TR> + <TH ALIGN="right"><font color="#ff0000">*</font>Country</TH> + <TD>$country_html</TD> +<TR> + <TD ALIGN="right">Day Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="daytime" VALUE="$daytime" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Night Phone</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="night" VALUE="$night" SIZE=18></TD> +</TR> +<TR> + <TD ALIGN="right">Fax</TD> + <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="$fax" SIZE=12></TD> +</TR> +!; + if ( $stateid_enabled ) { + my ($county_html, $state_html, $country_html) = + regionselector( { + prefix => 'stateid_', + default_state => $statedefault, + default_country => $countrydefault, + locales => \@cust_main_county, + } ); + $OUT .= qq!<TR><TD ALIGN="right">!. $label{stateid}.'</TD>'; + $OUT .= qq!<TD><INPUT TYPE="text" NAME="stateid" VALUE="$stateid" SIZE=12></TD>!; + $OUT .= qq!<TD ALIGN="right">!. $label{stateid_state} .'</TD>'; + $OUT .="<TD COLSPAN=3>$county_html $state_html</TD></TR>"; + } +$OUT .= qq! +</TABLE><font color="#ff0000">*</font> required fields<BR> +!; + +} +else { + @payby = ('PREPAY'); +} +%> + +<BR>Billing information<TABLE BGCOLOR="<%= $box_bgcolor || '#c0c0c0' %>" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR><TD> + + <%= + $OUT =''; + unless ( $emailinvoiceonly ) { + $OUT .= '<INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST"'; + my @invoicing_list = split(', ', $invoicing_list ); + $OUT .= ' CHECKED' + if ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list; + $OUT .= '> Postal mail invoice'; } + %> + + +</TD></TR> +<TR><TD><%= $OUT = ( $emailinvoiceonly ? q|<font color="#ff0000">*</font>| : q|| ) %> Email invoice <INPUT TYPE="text" NAME="invoicing_list" VALUE="<%= join(', ', grep { $_ ne 'POST' } split(', ', $invoicing_list ) ) %>"> +</TD></TR> +<%= ( scalar(@payby) > 1 or 1 ) ? '<TR><TD>Billing type ' : '' %> +<!--</TABLE> +<TABLE BGCOLOR="#c0c0c0" BORDER=1 WIDTH="100%"> +<TR>--> + + <%= + + my $cardselect = '<SELECT NAME="CARD_type"><OPTION></OPTION>'; + foreach ( keys %card_types ) { + $selected = $CARD_type eq $card_types{$_} ? 'SELECTED' : ''; + $cardselect .= qq!<OPTION $selected VALUE="$card_types{$_}">$_</OPTION>!; + } + $cardselect .= '</SELECT>'; + + my %payby = ( + 'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9> Type <SELECT NAME="CHEK_paytype">!. join('', map {qq!<OPTION VALUE="$_">$_</OPTION>!} @paytypes). qq!</SELECT><BR>{$r}Bank State <INPUT TYPE="text" NAME="CHEK_paystate" VALUE="" SIZE=5 MAXLENGTH=4><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="" MAXLENGTH=10> Type <SELECT NAME="DCHK_paytype">!. join('', map {qq!<OPTION VALUE="$_">$_</OPTION>!} @paytypes). qq!</SELECT><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><BR>{$r}Bank State <INPUT TYPE="text" NAME="DCHK_paystate" VALUE="" SIZE=5 MAXLENGTH=4><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" NAME="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"><INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037">Attention<INPUT TYPE="text" NAME="BILL_payname" VALUE="Accounts Payable">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("COMP"), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="" MAXLENGTH=80>!, + ); + + if ( $cvv_enabled ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $payby{$payby} .= qq!<TR><TD ALIGN="right">CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)</TD><TD><INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4></TD></TR>!; + } + } + if ( $paystate_enabled ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CHEK DCHK) ) { + my ($county_html, $state_html, $country_html) = + regionselector( { + prefix => "${payby}_pay", + default_state => $statedefault, + default_country => $countrydefault, + locales => \@cust_main_county, + } ); + $payby{$payby} .= "<BR>${r}Bank state $county_html $state_html"; + } + } + + my( $account, $aba ) = split('@', $payinfo); + my %paybychecked = ( + 'CARD' => '<TABLE BGCOLOR="'. ( $box_bgcolor || '#c0c0c0' ). qq!" BORDER=0 CELLSPACING=0 WIDTH="100%"><TR><TD ALIGN="right"><font color="#ff0000">*</font> Card type</TD><TD>$cardselect</TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Card number</TD><TD><INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19></TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Expration</TD><TD>!. expselect("CARD", $paydate). qq!</TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Name on card</TD><TD><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname"></TD></TR>!, + 'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!, + 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account" MAXLENGTH=10> Type <SELECT NAME="CHEK_paytype">!. join('', map {qq!<OPTION VALUE="$_"!.($paytype eq $_ ? 'SELECTED' : '').">$_</OPTION>"} @paytypes). qq!</SELECT><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!, + 'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account" MAXLENGTH=10> Type <SELECT NAME="DCHK_paytype">!. join('', map {qq!<OPTION VALUE="$_"!.($paytype eq $_ ? 'SELECTED' : '').">$_</OPTION>"} @paytypes). qq!</SELECT><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!, + 'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!, + 'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"><INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037">Attention<INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!, + 'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("COMP", $paydate), + 'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="$payinfo" MAXLENGTH=80>!, + ); + + if ( $cvv_enabled ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 + $paybychecked{$payby} .= qq!<TR><TD ALIGN="right">CVV2 (<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)</TD><TD><INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4></TD></TR>!; + } + } + if ( $paystate_enabled ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CHEK DCHK) ) { + my ($county_html, $state_html, $country_html) = + regionselector( { + prefix => "${payby}_pay", + selected_county => $county, + selected_state => $state, + selected_country => $country, + default_state => $statedefault, + default_country => $countrydefault, + locales => \@cust_main_county, + } ); + $paybychecked{$payby} .= "<BR>${r}Bank state $county_html $state_html"; + } + } + + my %payby_index = ( 'CARD' => qq/Credit Card/, + 'DCRD' => qq/Credit Card/, + 'CHEK' => qq/Check/, + 'DCHK' => qq/Check/, + 'LECB' => qq/Phone Bill Billing/, + 'BILL' => qq/Billing/, + 'COMP' => qq/Complimentary/, + 'PREPAY' => qq/Prepaid Card/, + ); + + +tie my %options, 'Tie::IxHash', (); + +foreach my $payby_option ( @payby ) { + $options{$payby_option} = $payby_index{$payby_option}; +} + +my $selected_layer = ( grep { $_ eq 'CARD' } @payby ) ? 'CARD' : $payby[0]; + +HTML::Widgets::SelectLayers->new( + options => \%options, + selected_layer => $selected_layer, + form_name => 'dummy', + html_between => '</td></tr></table>', + form_action => 'dummy.cgi', + layer_callback => sub { my $layer = shift; return ( shift @hide_payment_fields ? '' : $paybychecked{$layer} ) . '</TABLE>'; }, +)->html; + + + %> + +</TR></TABLE><font color="#ff0000">*</font> required fields +<FORM name="signup_form" action="<%= $self_url %>" METHOD="POST" onsubmit="return fixup_form();"><BR><BR>First package +<INPUT TYPE="hidden" NAME="promo_code" VALUE="<%= $promo_code %>"> +<INPUT TYPE="hidden" NAME="reg_code" VALUE="<%= $reg_code %>"> +<TABLE BGCOLOR="<%= $box_bgcolor || '#c0c0c0' %>" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> + <TD COLSPAN=2><SELECT NAME="pkgpart"> + + <%= + $OUT .= '<OPTION VALUE="">(none)' + unless scalar(@part_pkg) == 1 or $default_pkgpart; + foreach my $part_pkg ( @part_pkg ) { + $OUT .= '<OPTION VALUE="'. $part_pkg->{'pkgpart'}. '"'; + $OUT .= ' SELECTED' if $pkgpart && $part_pkg->{'pkgpart'} == $pkgpart; + $OUT .= '>'. $part_pkg->{'pkg'}; + } + %> + + </SELECT></TD> +</TR> +<%= + if ( $signup_service eq 'svc_phone' ) { + + $OUT .= '<TR><TD ALIGN="right">Phone number</TD><TD>'. + didselector( 'field' => 'phonenum', + 'svcpart' => $default_svcpart, + ). + '</TD></TR>'; + + $OUT .= <<ENDOUT; +<TR> + <TD ALIGN="right">Voicemail PIN</TD> + <TD><INPUT TYPE="pin" NAME="pin" VALUE="$pin"></TD> +</TR> +ENDOUT + + } else { + + $OUT .= <<ENDOUT; +<TR> + <TD ALIGN="right">Username</TD> + <TD><INPUT TYPE="text" NAME="username" VALUE="$username"></TD> +</TR> +<TR> + <TD ALIGN="right">Password</TD> + <TD><INPUT TYPE="password" NAME="_password" VALUE="$_password"></TD> +</TR> +<TR> + <TD ALIGN="right">Re-enter Password</TD> + <TD><INPUT TYPE="password" NAME="_password2" VALUE="$_password2"></TD> +</TR> +ENDOUT + + if ( $security_phrase ) { + $OUT .= <<SECPHRASE; +<TR> + <TD ALIGN="right">Security Phrase</TD> + <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase"> + </TD> +</TR> +SECPHRASE + } else { + $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">'; + } + + if ( $nomadix ) { + + warn $mac_addr; + $mac_addr ||= $MA; + warn $mac_addr; + + $OUT .= <<NOMADIX; + <INPUT TYPE="hidden" NAME="mac_addr" VALUE="$mac_addr"> +NOMADIX + + } + + } + + if ( @svc_acct_pop ) { + $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector( 'popnum' => $popnum, + 'pops' => \@svc_acct_pop, + 'init_popstate' => $init_popstate, + 'popac' => $popac, + 'acstate' => $acstate, + ). + '</TD></TR>'; + } else { + $OUT .= popselector(popnum=>$popnum, pops=>\@svc_acct_pop); + } + +%> + +</TABLE> + +<%= +if ( @optional_packages ) { + my @html; + foreach my $ii ( 0 .. $#optional_packages) { + my $friendly_index = $ii + 1; + if ($optional_packages[$ii]) { + push @html, qq|<BR>Optional Package #$friendly_index <br />|,'<table bgcolor="#c0c0c0"><tr><td>'; + + push @html, qq|<select name="optional_package${ii}">|; + push @html, qq|<option value="none"></option>|; + push @html, map { qq|<option value="$_->{pkgpart}">$_->{pkg}</option>| } @{$optional_packages[$ii]}; + push @html, q|</select>|; + + push @html, '</td></tr></table>'; + } + $OUT = join("\n", @html); + } +} else { +$OUT = '' +} +%> + +<BR><INPUT TYPE="submit" NAME="signup" VALUE="Signup"> +<script language="JavaScript"> + +function fixup_form() { + + // copy payment method data up to OneTrueForm + + var payment_method_elements = new Array( 'payinfo', 'payinfo1', 'payinfo2', 'payname', 'paycvv' , 'paystate', 'paytype', 'month', 'year','type' ); + var payment_method_form_name = document.OneTrueForm.select.options[document.OneTrueForm.select.selectedIndex].value; + document.OneTrueForm.elements['payby'].value = payment_method_form_name; + var payment_method_form = document.forms[payment_method_form_name]; + + for ( ii = 0 ; ii < payment_method_elements.length ; ii++ ) { + var true_element_name = payment_method_form_name + '_' + payment_method_elements[ii]; + copyelement ( payment_method_form.elements[true_element_name], + document.OneTrueForm.elements[true_element_name] ); + } + + // Copy signup details to OneTrueForm + + var signup_elements = new Array ( + 'promo_code', 'reg_code', 'pkgpart', + 'username', '_password', '_password2', 'sec_phrase', 'popnum', + 'mac_addr', + 'countrycode', 'phonenum', 'sip_password', 'pin' + ); + + for ( ii = 0 ; ii < signup_elements.length ; ii ++ ) { + copyelement ( document.signup_form.elements[signup_elements[ii]], + document.OneTrueForm.elements[signup_elements[ii]]); + } + + document.OneTrueForm.submit(); + return false; +} + +function copyelement(from, to) { +// alert ( from + ' ' + to ); + + if ( from == undefined ) { + to.value = ''; + } else { + if ( from.type == 'select-one' ) { + to.value = from.options[from.selectedIndex].value; + } else if ( from.type == 'checkbox' ) { + if ( from.checked ) { + to.value = from.value; + } else { + to.value = ''; + } + } else { + if ( from.value == undefined ) { + to.value = ''; + } else { + to.value = from.value; + } + } +// alert(from.name + " (" + from.type + "): " + to.name + " => " + to.value); + } +} + +</script> +</FORM> +<%= $OUT .= $body_footer %> +</BODY> +</HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/stateselect.html b/fs_selfservice/FS-SelfService/cgi/stateselect.html new file mode 100644 index 000000000..ba55bff74 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/stateselect.html @@ -0,0 +1,134 @@ +<HTML><HEAD><TITLE>ISP Signup</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>ISP Signup - state selection</FONT><BR><BR> +<SCRIPT> +function gotoURL(object) { + window.location.href = object.options[object.selectedIndex].value; +} +</SCRIPT> +<FORM> +Select your state from the map or dropdown: +<MAP NAME=usmap> +<area shape=poly COORDS="264,157,286,155,292,193,276,195,270,199,264,157" href="signup.cgi?init_popstate=AL"> +<area shape=poly COORDS="28,197,46,185,72,199,72,241,88,243,102,261,92,263,70,241,42,243,28,257,12,259,34,243,20,233,16,223,34,215,22,207,30,205,28,197" href="../states/Alaska.html"> +<area shape=poly COORDS="70,137,106,137,100,189,84,187,60,173,70,133,70,137,70,137" href="signup.cgi?init_popstate=AZ"> +<area shape=poly COORDS="250,153,242,179,220,177,218,171,216,145,252,143,250,155,250,153" href="signup.cgi?init_popstate=AR"> +<area shape=poly COORDS="10,79,38,81,30,109,62,151,56,173,40,169,20,145,4,101,10,75,26,79,10,79,10,79" href="signup.cgi?init_popstate=CA"> +<area shape=poly COORDS="108,103,158,107,154,141,104,137,110,101,128,103,108,103" href="signup.cgi?init_popstate=CO"> +<area shape=poly COORDS="374,107,405,105,405,123,372,125,374,107" href="signup.cgi?init_popstate=CT"> +<area shape=poly COORDS="370,143,402,145,405,157,362,157,370,143" href="signup.cgi?init_popstate=DE"> +<area shape=poly COORDS="275,193,325,187,327,197,341,219,341,233,335,237,317,215,315,205,307,195,293,203,275,193" href="signup.cgi?init_popstate=FL"> +<area shape=poly COORDS="297,153,283,155,297,191,321,189,321,169,297,153" href="signup.cgi?init_popstate=GA"> +<area shape=poly COORDS="98,233,142,263,156,251,162,239,164,229,136,231,94,221,100,235,98,233" href="signup.cgi?init_popstate=HI"> +<area shape=poly COORDS="68,21,76,21,72,35,80,47,80,55,84,65,100,69,94,93,56,83,66,51,70,19,68,21" href="signup.cgi?init_popstate=ID"> +<area shape=poly COORDS="242,91,258,89,266,123,256,139,234,109,248,87,242,91" href="signup.cgi?init_popstate=IL"> +<area shape=poly COORDS="261,95,265,123,265,131,285,117,277,91,261,95" href="signup.cgi?init_popstate=IN"> +<area shape=poly COORDS="198,87,206,111,232,109,240,99,240,91,232,79,198,87" href="signup.cgi?init_popstate=IA"> +<area shape=poly COORDS="158,111,158,135,214,139,214,127,208,113,158,111" href="signup.cgi?init_popstate=KS"> +<area shape=poly COORDS="263,133,275,129,289,115,303,121,307,129,299,135,251,141,269,131,263,133" href="signup.cgi?init_popstate=KY"> +<area shape=poly COORDS="222,179,246,179,244,197,258,193,262,213,226,209,224,177,222,179" href="signup.cgi?init_popstate=LA"> +<area shape=poly COORDS="363,37,373,59,373,47,387,31,377,9,365,15,363,37" href="signup.cgi?init_popstate=ME"> +<area shape=poly COORDS="376,159,405,159,405,175,374,177,376,159" href="signup.cgi?init_popstate=MD"> +<area shape=poly COORDS="378,74,380,88,404,88,404,72,378,74" href="signup.cgi?init_popstate=MA"> +<area shape=poly COORDS="265,73,269,83,265,93,293,91,295,71,281,53,271,53,267,69,265,73,265,73" href="signup.cgi?init_popstate=MI"> +<area shape=poly COORDS="194,31,222,33,242,35,224,51,222,63,222,73,234,79,196,85,194,31" href="signup.cgi?init_popstate=MN"> +<area shape=poly COORDS="265,159,271,199,257,201,259,195,241,197,251,155,265,159" href="signup.cgi?init_popstate=MS"> +<area shape=poly COORDS="206,113,234,111,256,139,248,147,214,145,208,111,206,113" href="signup.cgi?init_popstate=MO"> +<area shape=poly COORDS="78,23,148,31,146,67,84,63,78,35,80,19,78,23" href="signup.cgi?init_popstate=MT"> +<area shape=poly COORDS="146,85,148,103,158,105,164,109,206,109,198,85,144,87,146,85" href="signup.cgi?init_popstate=NE"> +<area shape=poly COORDS="40,83,76,87,64,151,32,109,40,83,40,83" href="signup.cgi?init_popstate=NV"> +<area shape=poly COORDS="298,11,330,9,330,25,298,25,298,11" href="signup.cgi?init_popstate=NH"> +<area shape=poly COORDS="372,127,404,125,405,141,368,139,376,125,372,127" href="signup.cgi?init_popstate=NJ"> +<area shape=poly COORDS="106,137,100,191,122,187,148,187,150,139,106,137,106,137" href="signup.cgi?init_popstate=NM"> +<area shape=poly COORDS="313,79,331,63,337,45,349,45,359,65,357,79,345,65,315,77,313,79,313,79" href="signup.cgi?init_popstate=NY"> +<area shape=poly COORDS="309,137,295,151,319,149,337,153,357,131,351,129,309,137,309,137" href="signup.cgi?init_popstate=NC"> +<area shape=poly COORDS="146,31,148,57,198,57,190,31,146,31,146,31" href="signup.cgi?init_popstate=ND"> +<area shape=poly COORDS="281,93,285,113,299,121,311,101,309,85,299,93,281,93,281,93" href="signup.cgi?init_popstate=OH"> +<area shape=poly COORDS="148,145,174,145,174,163,218,171,216,143,150,139,150,145,156,143,148,145,148,145" href="signup.cgi?init_popstate=OK"> +<area shape=poly COORDS="20,41,8,73,16,77,22,77,28,77,36,79,42,81,48,83,56,83,66,49,20,41,20,41" href="signup.cgi?init_popstate=OR"> +<area shape=poly COORDS="309,83,345,71,351,93,313,105,309,83,309,83" href="signup.cgi?init_popstate=PA"> +<area shape=poly COORDS="376,93,405,93,405,107,376,105,376,93" href="signup.cgi?init_popstate=RI"> +<area shape=poly COORDS="301,155,321,149,337,155,325,175,301,157,301,155,301,155" href="signup.cgi?init_popstate=SC"> +<area shape=poly COORDS="146,59,198,61,198,83,146,83,148,57,146,59,146,59" href="signup.cgi?init_popstate=SD"> +<area shape=poly COORDS="255,145,251,157,297,153,311,133,255,145,255,145" href="signup.cgi?init_popstate=TN"> +<area shape=poly COORDS="150,145,172,145,174,167,198,173,218,173,228,207,204,221,198,231,202,247,180,241,154,207,146,219,120,189,154,189,152,145,150,145,150,145" href="signup.cgi?init_popstate=TX"> +<area shape=poly COORDS="78,89,96,91,96,103,110,103,106,135,70,133,78,89,78,89" href="signup.cgi?init_popstate=UT"> +<area shape=poly COORDS="298,29,332,29,332,47,294,45,298,29" href="signup.cgi?init_popstate=VT"> +<area shape=poly COORDS="307,127,297,137,351,127,349,113,341,111,341,105,329,107,315,131,307,127,307,127" href="signup.cgi?init_popstate=VA"> +<area shape=poly COORDS="32,13,68,19,64,47,20,39,20,13,30,19,32,13,32,13" href="signup.cgi?init_popstate=WA"> +<area shape=poly COORDS="303,119,313,129,329,103,311,105,299,121,313,127,303,119,303,119" href="signup.cgi?init_popstate=WV"> +<area shape=poly COORDS="228,51,256,55,254,89,238,89,234,77,224,71,230,49,236,53,228,51,228,51" href="signup.cgi?init_popstate=WI"> +<area shape=poly COORDS="146,71,144,103,96,99,102,63,148,69,146,71,146,71" href="signup.cgi?init_popstate=WY"> +</MAP> +<IMG SRC="map.gif" usemap=#usmap WIDTH=405 HEIGHT=270 border=0><BR> +<SELECT NAME="init_popstate" onChange="gotoURL(this.form.init_popstate)"> +<OPTION VALUE="stateselect.html"></OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AL">Alabama</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AK">Alaska</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=AS">American Samoa</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=AZ">Arizona</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AR">Arkansas</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=CA">California</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=CO">Colorado</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=CT">Connecticut</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=DE">Delaware</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=DC">District of Columbia</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=FM">Federated States of Micronesia</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=FL">Florida</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=GA">Georgia</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=GU">Guam</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=HI">Hawaii</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=ID">Idaho</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=IL">Illinois</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=IN">Indiana</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=IA">Iowa</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=KS">Kansas</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=KY">Kentucky</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=LA">Louisiana</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=ME">Maine</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=MH">Marshall Islands</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=MD">Maryland</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=MA">Massachusetts</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=MI">Michigan</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=MN">Minnesota</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=MS">Mississippi</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=MO">Missouri</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=MT">Montana</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=NE">Nebraska</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=NV">Nevada</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=NH">New Hampshire</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=NJ">New Jersey</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=NM">New Mexico</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=NY">New York</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=NC">North Carolina</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=ND">North Dakota</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=MP">Northern Mariana Islands</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=OH">Ohio</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=OK">Oklahoma</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=OR">Oregon</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=PW">Palau</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=PA">Pennsylvania</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=PR">Puerto Rico</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=RI">Rhode Island</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=SC">South Carolina</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=SD">South Dakota</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=TN">Tennessee</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=TX">Texas</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=UT">Utah</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=VT">Vermont</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=VI">Virgin Islands</OPTION>--> +<OPTION VALUE="signup.cgi?init_popstate=VA">Virginia</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=WA">Washington</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=WV">West Virginia</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=WI">Wisconsin</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=WY">Wyoming</OPTION> +<!--<OPTION VALUE="signup.cgi?init_popstate=AE">Armed Forces Africa</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AA">Armed Forces Americas</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AE">Armed Forces Canada</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AE">Armed Forces Europe</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AE">Armed Forces Middle East</OPTION> +<OPTION VALUE="signup.cgi?init_popstate=AP">Armed Forces Pacific</OPTION> +--> +</SELECT> +</FORM> +</BODY> +</HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/success-delayed.html b/fs_selfservice/FS-SelfService/cgi/success-delayed.html new file mode 100644 index 000000000..5eeed5957 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/success-delayed.html @@ -0,0 +1,16 @@ +<HTML><HEAD><TITLE>Signup successful</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Signup successful</FONT><BR><BR> +Thanks for signing up! +<BR><BR> +Signup information for <%= $email_name %>: +<BR><BR> +Username: <%= $username %><BR> +Password: <%= $password %><BR> +Access number: (<%= $ac %>) / <%= $exch %> - <%= $local %><BR> +Package: <%= $pkg %><BR> +Charge: <%= sprintf('$%.2f', $part_pkg->{'options'}->{'setup_fee'}) %><BR> +In <%= $part_pkg->{'options'}->{'free_days'} %> days you will be charged + <%= sprintf('$%.2f', $part_pkg->{'options'}->{'recur_fee'}) %> +and <%= $part_pkg->{'freq_pretty'} %> thereafter.<BR> + +</BODY></HTML> diff --git a/fs_selfservice/FS-SelfService/cgi/success.html b/fs_selfservice/FS-SelfService/cgi/success.html new file mode 100644 index 000000000..ccbcc62b9 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/success.html @@ -0,0 +1,40 @@ +<HTML> + <HEAD> + <TITLE>Signup successful</TITLE> + <%= $head %> + </HEAD> + <BODY BGCOLOR="<%= $body_bgcolor || '#eeeeee' %>"> + <%= $body_header %> + +<FONT SIZE=7>Signup successful</FONT><BR><BR> + +Thanks for signing up! Save this information for future reference. +<BR><BR> + +Signup information for <%= $email_name %>: +<BR><BR> + +<%= + if ($signup_service eq 'svc_acct' || !$signup_service ) { #just in case + $OUT .= <<END + Username: $username<BR> + Password: $password<BR> + Access number: ($ac) / $exch - $local <BR> +END + } elsif ( $signup_service eq 'svc_phone' ) { + $OUT .= <<END + <!-- Countrycode: $countrycode <BR>--> + Phone number: $phonenum<BR> + SIP Server: itsp.sip.server.name<BR> + SIP Login: $phonenum<BR> + SIP Password: $sip_password<BR> + Voicemail PIN: $pin<BR> +END + } else { + die "unknown signup service $signup_service"; + } +%> + + Package: <%= $pkg %><BR> + +<%= $body_footer %> diff --git a/fs_selfservice/FS-SelfService/cgi/svc_acct.html b/fs_selfservice/FS-SelfService/cgi/svc_acct.html new file mode 100644 index 000000000..00244386b --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/svc_acct.html @@ -0,0 +1,58 @@ +<FONT SIZE=4>Setup <%= $svc %></FONT><BR><BR> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error setting up $svc: $error!. + '</FONT><BR><BR>'; +} ''; %> +<FORM ACTION="<%= $selfurl %>" METHOD=POST> +<INPUT TYPE="hidden" NAME="session" VALUE="<%= $session_id %>"> +<INPUT TYPE="hidden" NAME="action" VALUE="process_svc_acct"> +<INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>"> +<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%= $pkgnum %>"> +<INPUT TYPE="hidden" NAME="svcpart" VALUE="<%= $svcpart %>"> +<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#cccccc"> +<TR> + <TD ALIGN="right">Username</TD> + <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $username %>"></TD> +</TR> +<%= + $OUT .= domainselector(pkgnum=>$pkgnum, svcpart=>$svcpart); +%> +<TR> + <TD ALIGN="right">Password</TD> + <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $_password %>"></TD> +</TR> +<TR> + <TD ALIGN="right">Re-enter Password</TD> + <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $_password2 %>"></TD> +</TR> +<%= + if ( $security_phrase ) { + $OUT .= <<ENDOUT; +<TR> + <TD ALIGN="right">Security Phrase</TD> + <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase"> + </TD> +</TR> +ENDOUT + } else { + $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">'; + } +%> +<%= + if ( @svc_acct_pop ) { + $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'. + popselector( 'popnum' => $popnum, + 'pops' => \@svc_acct_pop, + 'init_popstate' => $init_popstate, + 'popac' => $popac, + 'acstate' => $acstate, + ). + '</TD></TR>'; + } else { + $OUT .= popselector(popnum=>$popnum, pops=>\@svc_acct_pop); + } +%> +</TABLE> +<INPUT TYPE="submit" VALUE="Setup"> +</FORM> diff --git a/fs_selfservice/FS-SelfService/cgi/tktcreate.html b/fs_selfservice/FS-SelfService/cgi/tktcreate.html new file mode 100644 index 000000000..de7ff60b8 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/tktcreate.html @@ -0,0 +1,38 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Create a ticket') %> + +<%= +if ( $ticket_id ) { + $OUT .= "<B>Created ticket #$ticket_id</B>"; +} else { + $OUT .= qq! + <div style='font-weight: bold; color: red; margin-bottom: 6px;'> $error </div> + Please fill in both the subject and message + <br><br> + <FORM ACTION="$selfurl" METHOD=POST> + <input type="hidden" name="session" value="$session_id"> + <input type="hidden" name="action" value="tktcreate"> + <table> + <tr> + <td>Your e-mail address</td> + <td>$requestor</td> + </tr> + <tr> + <td>Subject</td> + <td><input type="text" name="subject" size="53"></td> + </tr> + <tr> + <td valign="top">Message</td> + <td><textarea name="message" rows="10" cols="60"></textarea></td> + </tr> + <tr> + <td></td> + <td><input type="submit" value="Create"></td> + </tr> + </table> + </form> + !; +} +%> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/tktview.html b/fs_selfservice/FS-SelfService/cgi/tktview.html new file mode 100644 index 000000000..6f540bcf4 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/tktview.html @@ -0,0 +1,31 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "View ticket #$ticket_id") %> + +<%= +if($error) { + $OUT .= qq! <div style="font-weight: bold; color: red; font-size: 110%">Error: $error</div> !; +} +elsif(@transactions) { + $OUT .= qq! <TABLE border="1">!; + foreach my $txn ( @transactions ) { + next if $txn->{content} eq 'This transaction appears to have no content'; + $OUT .= "<TR><TD><B>$txn->{created} $txn->{description}</B>"; + $OUT .= "<PRE>$txn->{content}</PRE></TD></TR>"; + } + $OUT .= "</TABLE>"; +} +else { + $OUT .= "No transactions on this ticket"; +} +%> +<BR><BR><BR> +<FORM ACTION="<%=$selfurl%>" METHOD=POST> + <input type="hidden" name="session" value="<%=$session_id%>"> + <input type="hidden" name="ticket_id" value="<%=$ticket_id%>"> + <input type="hidden" name="action" value="tktview"> + Add reply to ticket: + <BR><textarea name="reply" cols="60" rows="10"></textarea> + <BR><input type="submit" value="Reply"> +</form> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/verify.cgi b/fs_selfservice/FS-SelfService/cgi/verify.cgi new file mode 100755 index 000000000..d9346b897 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/verify.cgi @@ -0,0 +1,177 @@ +#!/usr/bin/perl -T +#!/usr/bin/perl -Tw + +use strict; +use vars qw( $cgi $self_url $error + $verify_html $verify_template + $success_html $success_template + $decline_html $decline_template + ); + +use subs qw( print_verify print_okay print_decline + verify_default success_default decline_default + ); +use CGI; +use Text::Template; +use FS::SelfService qw( capture_payment ); + +$verify_html = -e 'verify.html' + ? 'verify.html' + : '/usr/local/freeside/verify.html'; +$success_html = -e 'verify_success.html' + ? 'success.html' + : '/usr/local/freeside/success.html'; +$decline_html = -e 'verify_decline.html' + ? 'decline.html' + : '/usr/local/freeside/decline.html'; + + +if ( -e $verify_html ) { + my $verify_txt = Text::Template::_load_text($verify_html) + or die $Text::Template::ERROR; + $verify_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $verify_txt = $1; + $verify_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $verify_txt, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} else { + $verify_template = new Text::Template ( TYPE => 'STRING', + SOURCE => &verify_default, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} + +if ( -e $success_html ) { + my $success_txt = Text::Template::_load_text($success_html) + or die $Text::Template::ERROR; + $success_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $success_txt = $1; + $success_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $success_txt, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} else { + $success_template = new Text::Template ( TYPE => 'STRING', + SOURCE => &success_default, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} + +if ( -e $decline_html ) { + my $decline_txt = Text::Template::_load_text($decline_html) + or die $Text::Template::ERROR; + $decline_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $decline_txt = $1; + $decline_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $decline_txt, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} else { + $decline_template = new Text::Template ( TYPE => 'STRING', + SOURCE => &decline_default, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} + +$cgi = new CGI; + +my $rv = capture_payment( + data => { 'manual' => 1, + map { $_ => scalar($cgi->param($_)) } $cgi->param + }, + url => $cgi->self_url, +); + +$error = $rv->{error}; + +if ( $error eq '_decline' ) { + print_decline(); +} elsif ( $error ) { + print_verify(); +} else { + print_okay(%$rv); +} + + +sub print_verify { + + $error = "Error: $error" if $error; + + my $r = { $cgi->Vars, 'error' => $error }; + + $r->{self_url} = $cgi->self_url; + + print $cgi->header( '-expires' => 'now' ), + $verify_template->fill_in( PACKAGE => 'FS::SelfService::_signupcgi', + HASH => $r + ); +} + +sub print_decline { + print $cgi->header( '-expires' => 'now' ), + $decline_template->fill_in(); +} + +sub print_okay { + my %param = @_; + + my @success_url = split '/', $cgi->url(-path); + pop @success_url; + + my $success_url = join '/', @success_url; + if ($param{session_id}) { + my $session_id = lc($param{session_id}); + $success_url .= "/selfservice.cgi?action=myaccount&session=$session_id"; + } else { + $success_url .= '/signup.cgi?action=success'; + } + + print $cgi->header( '-expires' => 'now' ), + $success_template->fill_in( HASH => { success_url => $success_url } ); +} + +sub success_default { #html to use if you don't specify a success file + <<'END'; +<HTML><HEAD><TITLE>Signup successful</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Signup successful</FONT><BR><BR> +Thanks for signing up! +<BR><BR> +<SCRIPT TYPE="text/javascript"> + window.top.location="<%= $success_url %>"; +</SCRIPT> +</BODY></HTML> +END +} + +sub verify_default { #html to use for verification response + <<'END'; +<HTML><HEAD><TITLE>Processing error</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Processing error</FONT><BR><BR> +There has been an error processing your account. Please contact customer +support. +</BODY></HTML> +END +} + +sub decline_default { #html to use if there is a decline + <<'END'; +<HTML><HEAD><TITLE>Processing error</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Processing error</FONT><BR><BR> +There has been an error processing your account. Please contact customer +support. +</BODY></HTML> +END +} + +# subs for the templates... + +package FS::SelfService::_signupcgi; +use HTML::Entities; + diff --git a/fs_selfservice/FS-SelfService/cgi/view_cdr_details.html b/fs_selfservice/FS-SelfService/cgi/view_cdr_details.html new file mode 100644 index 000000000..6d4d8475e --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/view_cdr_details.html @@ -0,0 +1,54 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Call usage for '. + Date::Format::time2str('%b %o %Y', $beginning). + ' - '. + Date::Format::time2str('%b %o %Y', $ending) + ) +%> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} ''; %> + +<TABLE WIDTH="100%"> + <TR> + <TD WIDTH="50%"> +<%= if ($previous < $beginning) { + $OUT .= qq!<A HREF="${url}view_cdr_details;svcnum=$svcnum;beginning=!; + $OUT .= qq!$previous;ending=$beginning">Previous period</A>!; + }else{ + ''; + } %> + </TD> + <TD WIDTH="50%" ALIGN="right"> +<%= if ($next > $ending) { + $OUT .= qq!<A HREF="${url}view_cdr_details;svcnum=$svcnum;beginning=!; + $OUT .= qq!$ending;ending=$next">Next period</A>!; + }else{ + ''; + }%> + </TD> + </TR> +</TABLE> +<TABLE BGCOLOR="#cccccc"> + <TR> +<%= foreach my $header (@header) { + $OUT .= qq(<TH ALIGN="right">$header</TH>); + } +%> + </TR> +<%= my $total = 0; + my $utotal = 0; + my $dtotal = 0; + foreach my $usage ( @usage ) { + $OUT .= '<TR>'; + $OUT .= qq(<TD>$_</TD>) foreach @{$usage}; + $OUT .= '</TR>'; + } +%> + +</TABLE> +<BR> + +</TD></TR></TABLE> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/view_customer.html b/fs_selfservice/FS-SelfService/cgi/view_customer.html new file mode 100644 index 000000000..5bfb9b6fd --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/view_customer.html @@ -0,0 +1,24 @@ +<HTML><HEAD><TITLE>Reseller</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>Reseller</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_menu') %> +<TD VALIGN="top"> + +<%= $message + ? "<FONT SIZE=\"+2\"><B>$message</B></FONT><BR><BR>" + : '' +%> + +<%= $small_custview %> + +<BR> + +<TABLE BORDER=0 CELLPADDING=4><TR> +<%= include('agent_customer_menu') %> +<TD VALIGN="top"> + +</TD></TR></TABLE> + +</TD></TR></TABLE> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/view_invoice.html b/fs_selfservice/FS-SelfService/cgi/view_invoice.html new file mode 100644 index 000000000..072a4147c --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/view_invoice.html @@ -0,0 +1,6 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Invoice') %> + +<%= $invoice_html %> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/view_port_graph.html b/fs_selfservice/FS-SelfService/cgi/view_port_graph.html new file mode 100644 index 000000000..d42f405b9 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/view_port_graph.html @@ -0,0 +1,15 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', "Service usage details for $start - $end") %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} +else { + $OUT .= qq! <IMG SRC="${url}real_port_graph;svcnum=$svcnum;start=$start;end=$end"> !; +} +$OUT .= ''; +%> + +<BR> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/view_support_details.html b/fs_selfservice/FS-SelfService/cgi/view_support_details.html new file mode 100644 index 000000000..ea218749c --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/view_support_details.html @@ -0,0 +1,78 @@ +<HTML><HEAD><TITLE>MyAccount</TITLE></HEAD> +<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>MyAccount</FONT><BR><BR> +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('myaccount_menu') %> +<TD VALIGN="top"> + +<FONT SIZE=4>Support usage details for +<%= Date::Format::time2str('%b %o %Y', $beginning) %> - +<%= Date::Format::time2str('%b %o %Y', $ending) %> +</FONT><BR><BR> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} ''; %> + +<TABLE WIDTH="100%"> + <TR> + <TD WIDTH="50%"> +<%= if ($previous < $beginning) { + $OUT .= qq!<A HREF="${url}view_support_details;svcnum=$svcnum;beginning=!; + $OUT .= qq!$previous;ending=$beginning">Previous period</A>!; + }else{ + ''; + } %> + </TD> + <TD WIDTH="50%" ALIGN="right"> +<%= if ($next > $ending) { + $OUT .= qq!<A HREF="${url}view_support_details;svcnum=$svcnum;beginning=!; + $OUT .= qq!$ending;ending=$next">Next period</A>!; + }else{ + ''; + }%> + </TD> + </TR> +</TABLE> +<TABLE BGCOLOR="#cccccc"> + <TR> + <TH ALIGN="left">Ticket</TH> + <TH ALIGN="center">Subject</TH> + <TH ALIGN="center">Staff</TH> + <TH ALIGN="center">Date</TH> + <TH ALIGN="center">Status</TH> + <TH ALIGN="right">Time</TH> + </TR> +<%= my $total = 0; + foreach my $usage ( @usage ) { + $OUT .= '<TR><TD ALIGN="left">'; + $OUT .= $usage->{'ticketid'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $usage->{'subject'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $usage->{'creator'}; + $OUT .= '</TD><TD ALIGN="left">'; + $OUT .= Date::Format::time2str('%T%P %a %b %o %Y', $usage->{'_date'}); + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $usage->{'status'}; + $OUT .= '</TD><TD ALIGN="right">'; + my $duration = $usage->{'support'}; + $total += $usage->{'support'}; + my $h = int($duration/3600); + my $m = sprintf("%02d", int(($duration % 3600) / 60)); + my $s = sprintf("%02d", $duration % 60); + $OUT .= $usage->{'support'} < 0 ? '-' : ''; + $OUT .= "$h:$m:$s"; + $OUT .= '</TD></TR>'; + } + my $h = int($total/3600); + my $m = sprintf("%02d", int(($total % 3600) / 60)); + my $s = sprintf("%02d", $total % 60); + $OUT .= qq!<TR><TD COLSPAN="5"></TD><TD ALIGN="right"><HR></TD></TR>!; + $OUT .= qq!<TR><TD COLSPAN="5"></TD><TD ALIGN="right">$h:$m:$s</TD></TR>!; + %> + +</TABLE> +<BR> + +</TD></TR></TABLE> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/view_usage.html b/fs_selfservice/FS-SelfService/cgi/view_usage.html new file mode 100644 index 000000000..170237a6b --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/view_usage.html @@ -0,0 +1,142 @@ +<%= $url = "$selfurl?session=$session_id;action="; + @svc_acct = grep { $_->{svcdb} eq 'svc_acct' } @svcs; + @svc_phone = grep { $_->{svcdb} eq 'svc_phone' } @svcs; + @svc_port = grep { $_->{svcdb} eq 'svc_port' } @svcs; + ''; +%> +<%= include('header', 'Account usage') %> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} ''; %> + +<%= if ( @svc_acct ) { + $OUT.= '<TABLE BGCOLOR="#cccccc"> + <TR> + <TH ALIGN="left">Account</TH> + <TH ALIGN="right">Time remaining</TH> + <TH ALIGN="right">Upload remaining</TH> + <TH ALIGN="right">Download remaining</TH> + <TH ALIGN="right">Total remaining</TH> + </TR>'; + } else { + $OUT .= ''; + } +%> + +<%= foreach my $svc ( @svc_acct ) { + my $link = "${url}view_usage_details;". + "svcnum=$svc->{'svcnum'};beginning=0;ending=0"; + $OUT .= '<TR><TD>'; + $OUT .= qq!<A HREF="$link">!. $svc->{'label'}. ': '. $svc->{'value'}.'</A>'; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'seconds'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'upbytes'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'downbytes'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'totalbytes'}; + $OUT .= '</TD></TR>'; + if ( $svc->{'recharge_amount'} ) { + my $link = "${url}process_order_recharge;". + "svcnum=$svc->{'svcnum'}"; + $OUT .= '<TR><TD ALIGN="right">'; + $OUT .= qq!<A HREF="$link">!.'Recharge for $'; + $OUT .= $svc->{'recharge_amount'} . '</A> with'; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'recharge_seconds'} if $svc->{'recharge_seconds'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'recharge_upbytes'} if $svc->{'recharge_upbytes'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'recharge_downbytes'} if $svc->{'recharge_downbytes'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= $svc->{'recharge_totalbytes'} if $svc->{'recharge_totalbytes'}; + $OUT .= '</TD></TR>'; + } + } +%> + +<%= scalar(@svc_acct) ? '</TABLE><BR><BR>' : '' %> + +<%= if ( @svc_phone ) { + $OUT.= '<FONT SIZE="4">Call usage</FONT><BR><BR> + <TABLE BGCOLOR="#cccccc"> + <TR> + <TH ALIGN="left">Number</TH>'; #"Account" ? + #what else? + $OUT .= '</TR>'; + } else { + $OUT .= ''; + } +%> + +<%= foreach my $svc_phone ( @svc_phone ) { + my $link = "${url}view_cdr_details;". + "svcnum=$svc_phone->{'svcnum'};beginning=0;ending=0"; + $OUT .= '<TR><TD>'; + $OUT .= qq!<A HREF="$link">!. $svc_phone->{'label'}. ': '. $svc_phone->{'value'}.'</A>'; + $OUT .= '</TD></TR>'; + } +%> + +<%= scalar(@svc_phone) ? '</TABLE><BR><BR>' : '' %> + +<%= if ( @svc_port ) { + $OUT.= '<FONT SIZE="4">Bandwidth Graphs</FONT><BR><BR> + <script type="text/javascript"> + function preset_range(start,end,prefix){ + document.getElementById(prefix+\'_start\').value = start; + document.getElementById(prefix+\'_end\').value = end; + } + </script> + <TABLE BGCOLOR="#cccccc"> + <TR> + <TH ALIGN="left">Service</TH> + <TH ALIGN="right"> + </TH> + </TR>'; + } + $OUT .= ''; +%> + +<%= + +sub preset_range { + my($start,$end,$label,$date_format,$prefix) = (shift,shift,shift,shift,shift); + $start = Date::Format::time2str($date_format,$start); + $end = Date::Format::time2str($date_format,$end); + return '<A HREF="javascript:void(0);" onclick="preset_range(\'' + .$start.'\',\''.$end.'\',\''.$prefix.'\')">'.$label.'</A>'; +} + +foreach my $svc_port ( @svc_port ) { + $svcnum = $svc_port->{'svcnum'}; + $default_end = time; + $default_start = $default_end-86400; + + $OUT .= '<TR><TD>'. $svc_port->{'label'}. ': '. $svc_port->{'value'}.'</TD>'; + $OUT .= qq! <TD><FORM ACTION="$url" METHOD="GET"> + <INPUT TYPE="hidden" name="svcnum" value="$svcnum"> + <INPUT TYPE="hidden" name="action" value="view_port_graph"> + <INPUT TYPE="hidden" name="session" value="$session_id"> !; + $OUT .= preset_range($default_start,$default_end,'Last Day',$date_format,$svcnum) + .' | '.preset_range($default_end-86400*7,$default_end,'Last Week',$date_format,$svcnum) + .' | '.preset_range($default_end-86400*30,$default_end,'Last Month',$date_format,$svcnum) + .' | '.preset_range($default_end-86400*365,$default_end,'Last Year',$date_format,$svcnum); + + $OUT .= qq! <BR> + Start Date <INPUT TYPE="TEXT" id="${svcnum}_start" name="${svcnum}_start" SIZE="10" MAXLENGTH="10"> + End Date <INPUT TYPE="TEXT" id="${svcnum}_end" name="${svcnum}_end" SIZE="10" MAXLENGTH="10"> + <BR> + <INPUT TYPE="submit" value="Display"> !; + + $OUT .= '</FORM></TD></TR>'; +} +%> + +<%= scalar(@svc_port) ? '</TABLE><BR><BR>' : '' %> + + +</TD></TR></TABLE> +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/view_usage_details.html b/fs_selfservice/FS-SelfService/cgi/view_usage_details.html new file mode 100644 index 000000000..c4cc177e1 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/view_usage_details.html @@ -0,0 +1,80 @@ +<%= $url = "$selfurl?session=$session_id;action="; ''; %> +<%= include('header', 'Service usage details for '. + Date::Format::time2str('%b %o %Y', $beginning). + ' - '. + Date::Format::time2str('%b %o %Y', $ending) + ) +%> + +<%= if ( $error ) { + $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">$error</FONT><BR><BR>!; +} ''; %> + +<TABLE WIDTH="100%"> + <TR> + <TD WIDTH="50%"> +<%= if ($previous < $beginning) { + $OUT .= qq!<A HREF="${url}view_usage_details;svcnum=$svcnum;beginning=!; + $OUT .= qq!$previous;ending=$beginning">Previous period</A>!; + }else{ + ''; + } %> + </TD> + <TD WIDTH="50%" ALIGN="right"> +<%= if ($next > $ending) { + $OUT .= qq!<A HREF="${url}view_usage_details;svcnum=$svcnum;beginning=!; + $OUT .= qq!$ending;ending=$next">Next period</A>!; + }else{ + ''; + }%> + </TD> + </TR> +</TABLE> +<TABLE BGCOLOR="#cccccc"> + <TR> + <TH ALIGN="left">Account</TH> + <TH ALIGN="right">Start Time</TH> + <TH ALIGN="right">Duration</TH> + <TH ALIGN="right">Upload</TH> + <TH ALIGN="right">Download</TH> + </TR> +<%= my $total = 0; + my $utotal = 0; + my $dtotal = 0; + foreach my $usage ( @usage ) { + $OUT .= '<TR><TD>'; + $OUT .= $usage->{'username'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= Date::Format::time2str('%T%P %a %b %o %Y', $usage->{'acctstarttime'}); + $OUT .= '</TD><TD ALIGN="right">'; + my $duration = $usage->{'acctstoptime'} - $usage->{'acctstarttime'}; + $total += $duration; + my $h = int($duration/3600); + my $m = sprintf("%02d", int(($duration % 3600) / 60)); + my $s = sprintf("%02d", $duration % 60); + $OUT .= "$h:$m:$s"; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= Number::Format::format_bytes($usage->{'acctinputoctets'}, precision => 2); + $utotal += $usage->{'acctinputoctets'}; + $OUT .= '</TD><TD ALIGN="right">'; + $OUT .= Number::Format::format_bytes($usage->{'acctoutputoctets'}, precision => 2); + $dtotal += $usage->{'acctoutputoctets'}; + $OUT .= '</TD></TR>'; + } + my $h = int($total/3600); + my $m = sprintf("%02d", int(($total % 3600) / 60)); + my $s = sprintf("%02d", $total % 60); + $OUT .= qq!<TR><TD></TD><TD></TD>!; + $OUT .= qq!<TD ALIGN="right"><HR></TD>! x 3; + $OUT .= qq!</TR>!; + $OUT .= qq!<TR><TD></TD><TD></TD><TD ALIGN="right">$h:$m:$s</TD>!; + $OUT .= qq!<TD ALIGN="right">!; + $OUT .= Number::Format::format_bytes($utotal, precision => 2). qq!</TD>!; + $OUT .= qq!<TD ALIGN="right">!; + $OUT .= Number::Format::format_bytes($dtotal, precision => 2). qq!</TD>!; + $OUT .= qq!</TR>!; %> + +</TABLE> +<BR> + +<%= include('footer') %> diff --git a/fs_selfservice/FS-SelfService/cgi/ws_list.html b/fs_selfservice/FS-SelfService/cgi/ws_list.html new file mode 100644 index 000000000..dcc62ec86 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/ws_list.html @@ -0,0 +1,151 @@ +<%= + +sub ws_pkglink { + my($cat,$count,$link) = (shift,shift,shift); + return "0 $cat <BR>" unless $count->{$cat}; + return qq! <A HREF="${link};filter=$cat">$count->{$cat}</A> $cat <BR> !; +} + +sub ws_pkgstatus { + my $pkg = shift; + $status = "unbilled"; + $status = "active" if ( $pkg->{setup} && !$pkg->{cancel} + && !$pkg->{susp} ); + $status = "suspended" if ( $pkg->{susp} && !$pkg->{cancel} ); + $status = "cancelled" if $pkg->{cancel}; + $status; +} + +sub pdate { + my($field,$date_format) = (shift,shift); + return "<TD>".Date::Format::time2str($date_format,$field)."</TD>" + if $field && $field > 0; + '<TD></TD>'; +} + + +if ( $pkgpart ) { + $OUT .= qq! <TABLE style="empty-cells: show;" class="svctable"><TR><TH>Package</TH><TH>Status</TH> !; + $OUT .= "<TH>Setup</TH><TH>Last Bill</TH><TH>Next Bill</TH><TH>Adjourn</TH>"; + $OUT .= "<TH>Suspend</TH><TH>Expire</TH><TH>Contract End</TH>"; + $OUT .= "<TH>Cancel</TH><TH>Services</TH></TR>"; + foreach my $pkg ( @cust_pkg ) { + my $part_pkg = $pkg->{part_pkg}[0]; + $status = ws_pkgstatus($pkg); + if($pkg->{pkgpart} == $pkgpart && + ( ($filter && $filter eq $status) || !$filter) ) { + $OUT .= "<TR><TD>$part_pkg->{pkg}</TD><TD>$status</TD>"; + $OUT .= pdate($pkg->{setup},$date_format); + $OUT .= pdate($pkg->{last_bill},$date_format); + $OUT .= pdate($pkg->{bill},$date_format); + $OUT .= pdate($pkg->{adjourn},$date_format); + $OUT .= pdate($pkg->{susp},$date_format); + $OUT .= pdate($pkg->{expire},$date_format); + $OUT .= pdate($pkg->{contract_end},$date_format); + $OUT .= pdate($pkg->{cancel},$date_format); + + $OUT .= "<TD style='font-size: 85%'>"; + my @cust_svc = @{$pkg->{cust_svc}}; + foreach my $cust_svc ( @cust_svc ) { + my @label = @{$cust_svc->{'label'}}; + $OUT .= qq!$label[0]: $label[1] <BR><BR>!; + } + my @part_svc = @{$pkg->{part_svc}}; + foreach my $part_svc ( @part_svc ) { + my $link = qq!<A HREF="${url}provision_svc;! + . qq!pkgnum=$pkg->{'pkgnum'};svcpart=$part_svc->{'svcpart'}! + . qq!;numavail=$part_svc->{'num_avail'}">Setup ! + . qq!$part_svc->{'svc'}</A> ($part_svc->{'num_avail'}! + . qq! available)<BR><BR>!; + $OUT .= $link if $part_svc->{'can_get_dids'}; + + if($part_svc->{'svcdb'} eq 'svc_phone' && $lnp) { + $OUT .= qq!<A HREF="${url}provision_svc;lnp=1;! + . qq!pkgnum=$pkg->{'pkgnum'};svcpart=$part_svc->{'svcpart'}! + . qq!">Port-In $part_svc->{'svc'}</A>!; + } + } + + $OUT .= "</TD></TR>"; + } + } + $OUT .= "</TABLE>"; +} +else { + my %pkgparts; + foreach my $pkg ( @cust_pkg ) { + my $status = ws_pkgstatus($pkg); + $pkgparts{$pkg->{pkgpart}}{$status}++; + my $part_pkg = $pkg->{part_pkg}[0]; + $pkgparts{$pkg->{pkgpart}}{pkg} = $part_pkg->{pkg}; + } + + $OUT .= "<TABLE><TR><TD>"; + + $OUT .= qq! <TABLE class="svctable"><TR><TH>Package</TH><TH>Status</TH></TR> !; + my($pkgpart,$counts); + while(($pkgpart,$count) = each %pkgparts){ + my $link = "${url}provision;pkgpart=$pkgpart"; + $OUT .= qq! <TR><TD><A HREF="$link">$count->{pkg}</A></TD><TD> !; + $OUT .= ws_pkglink("unbilled",$count,$link); + $OUT .= ws_pkglink("active",$count,$link); + $OUT .= ws_pkglink("suspended",$count,$link); + $OUT .= ws_pkglink("cancelled",$count,$link); + $OUT .= "</TD></TR>"; + } + $OUT .= "</TABLE>"; + + $OUT .= qq!</TD><TD VALIGN="TOP" STYLE="padding-left: 11px;">!; + + if ( @login_svcpart ) { + $OUT .= "<B>Self-service accounts</B><BR>"; + foreach my $pkg ( @cust_pkg ) { + @cust_svc = @{$pkg->{cust_svc}}; + @part_svc = @{$pkg->{part_svc}}; + + foreach my $cust_svc ( @cust_svc ) { + $svcpart = $cust_svc->{'svcpart'}; + next unless grep($_ eq $svcpart, @login_svcpart); + @label = @{$cust_svc->{'label'}}; + $OUT .= $label[1] . " "; + unless ( $cust_svc->{'svcnum'} == $svcnum ) { + $OUT .= qq!<A HREF="javascript:areyousure('${url}delete_svc;svcnum=$cust_svc->{svcnum}', 'This will permanently delete the $label[1] $label[0]. Are you sure?')">!. + 'Delete</A>'; + } + $OUT .= "<BR>"; + } + + foreach my $part_svc ( @part_svc ) { + $svcpart = $part_svc->{'svcpart'}; + next unless grep($_ eq $svcpart, @login_svcpart); + $link = "${url}provision_svc;pkgnum=$pkg->{'pkgnum'};". + "svcpart=$part_svc->{'svcpart'}"; + $OUT .= qq!<A HREF="$link">!. 'Setup '. $part_svc->{'svc'}. + '</A> ('. $part_svc->{'num_avail'}. ' available)' + if $part_svc->{'svcdb'} eq 'svc_acct'; + } + + } # foreach cust_pkg + } # login_svcpart + + my $hasPhone = 0; + foreach my $pkg ( @cust_pkg ) { + @cust_svc = @{$pkg->{cust_svc}}; + foreach my $cust_svc ( @cust_svc ) { + @label = @{$cust_svc->{'label'}}; + $hasPhone = 1 if $label[2] eq 'svc_phone'; + } + } + if ( $hasPhone ) { + $link = "${url}didreport;type="; + $OUT .= "<BR><BR><BR>Download currently allocated DIDs:<BR>"; + $OUT .= qq! <A HREF="${link}csv">CSV</A> | + <A HREF="${link}xls">Excel</A>!; + $OUT .= "<BR><BR>Download recently allocated DIDs:<BR>"; + $OUT .= qq! <A HREF="${link}csv;recentonly=1">CSV</A> | + <A HREF="${link}xls;recentonly=1">Excel</A>!; + } + + $OUT .= "</TD></TR></TABLE>"; +} +%> diff --git a/fs_selfservice/FS-SelfService/cgi/xmlrpc.cgi b/fs_selfservice/FS-SelfService/cgi/xmlrpc.cgi new file mode 100644 index 000000000..559ae04d8 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/xmlrpc.cgi @@ -0,0 +1,18 @@ +#!/usr/bin/perl -Tw + +use strict; +use XMLRPC::Transport::HTTP; +use XMLRPC::Lite; # for XMLRPC::Serializer +use FS::SelfService::XMLRPC; + +my %typelookup = ( + base64 => [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'], + dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'], + string => [40, sub {1}, 'as_string'], +); +my $serializer = new XMLRPC::Serializer(typelookup => \%typelookup); + +XMLRPC::Transport::HTTP::CGI->dispatch_to('FS::SelfService::XMLRPC') + ->serializer($serializer) + ->handle; + |