You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							2859 lines
						
					
					
						
							78 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							2859 lines
						
					
					
						
							78 KiB
						
					
					
				
								#!/usr/bin/perl
							 | 
						|
								#
							 | 
						|
								# $Id: smilib.pl,v 1.51 2006/11/28 21:07:48 psims Exp $
							 | 
						|
								#
							 | 
						|
								# Source File: smilib.pl
							 | 
						|
								
							 | 
						|
								require 'sitecfg.pl';
							 | 
						|
								use POSIX;
							 | 
						|
								use Time::HiRes;
							 | 
						|
								use CGI qw/:standard/;
							 | 
						|
								# use Data::Dumper;
							 | 
						|
								
							 | 
						|
								sub get_client_configuration {
							 | 
						|
									$omsg = "not found";
							 | 
						|
									if ($_[0]) {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.$_[0]");
							 | 
						|
										$omsg = "";
							 | 
						|
										open( CFGFILE, "<$trash" ) or $omsg="not found";
							 | 
						|
								 	} 
							 | 
						|
									if ($omsg eq 'not found') {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.$SESSION{'clid'}");
							 | 
						|
										$omsg = "";
							 | 
						|
										open( CFGFILE, "<$trash" ) or $omsg="not found";
							 | 
						|
									}
							 | 
						|
									if ($omsg eq 'not found') {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.std");
							 | 
						|
										open( CFGFILE, "<$trash" ) or return;
							 | 
						|
									}
							 | 
						|
									@cfgentries = <CFGFILE>;
							 | 
						|
									close CFGFILE;
							 | 
						|
									for (0 .. $#cfgentries) {
							 | 
						|
										chop ($cfgentries[$_]);
							 | 
						|
										($entrykey,$entryvalue) = split(/=/, $cfgentries[$_]);
							 | 
						|
										$SYSTEM{$entrykey} = $entryvalue;
							 | 
						|
									}
							 | 
						|
									if (($SESSION{'clid'} ne 'sacc') && ($SESSION{'clid'} ne 'std')) {
							 | 
						|
										$SYSTEM{'languagesupport'} = ($SYSTEM{'ALLOWEDLANGS'} eq '' || $SYSTEM{'ALLOWEDLANGS'} =~ /none/) ? "FALSE" : "TRUE";
							 | 
						|
									} else {
							 | 
						|
										$SYSTEM{'languagesupport'} = "TRUE";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub put_client_configuration {
							 | 
						|
									$omsg = "not found";
							 | 
						|
									if ($_[0]) {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.$_[0]");
							 | 
						|
										$omsg = "";
							 | 
						|
										open( CFGFILE, "<$trash" ) or $omsg="not found";
							 | 
						|
								 	} 
							 | 
						|
									if ($omsg eq 'not found') {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.$SESSION{'clid'}");
							 | 
						|
										$omsg = "";
							 | 
						|
										open( CFGFILE, "<$trash" ) or $omsg="not found";
							 | 
						|
									}
							 | 
						|
									if ($omsg eq 'not found') {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.std");
							 | 
						|
										open( CFGFILE, "<$trash" ) or return;
							 | 
						|
									}
							 | 
						|
									@cfgentries = <CFGFILE>;
							 | 
						|
									close CFGFILE;
							 | 
						|
									for (0 .. $#cfgentries) {
							 | 
						|
										chop ($cfgentries[$_]);
							 | 
						|
										($entrykey,$entryvalue) = split(/=/, $cfgentries[$_]);
							 | 
						|
										$key = "C$entrykey";
							 | 
						|
										$key =~ s/ /+/g;
							 | 
						|
										if ($FORM{$key} ne '') {
							 | 
						|
											$cfgentries[$_] = "$entrykey=$FORM{$key}";
							 | 
						|
										} else {
							 | 
						|
											if ( $entrykey eq 'IP_ACCESS_FILTER') {
							 | 
						|
												$cfgentries[$_] = "$entrykey=$FORM{'CIP_ACCESS_FILTER'}";
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$omsg = "not found";
							 | 
						|
									if ($_[0]) {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.$_[0]");
							 | 
						|
										$omsg = "";
							 | 
						|
										open( CFGFILE, ">$trash" ) or $omsg="not found";
							 | 
						|
								 	} 
							 | 
						|
									if ($omsg eq 'not found') {
							 | 
						|
										$trash = join( $pathsep, $dataroot, "config.$SESSION{'clid'}");
							 | 
						|
										$omsg = "";
							 | 
						|
										open( CFGFILE, ">$trash" ) or $omsg="not found";
							 | 
						|
									}
							 | 
						|
									if ($omsg ne 'not found') {
							 | 
						|
										for (0 .. $#cfgentries) {
							 | 
						|
											print CFGFILE "$cfgentries[$_]\n";
							 | 
						|
										}
							 | 
						|
										close CFGFILE;
							 | 
						|
									}
							 | 
						|
									$chmodok = chmod 0666, $trash;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub createtrace {
							 | 
						|
									my $trash = join( $pathsep, $secroot, "$ENV{'REMOTE_ADDR'}.log");
							 | 
						|
									my $msg = "";
							 | 
						|
									open( TRACEFILE, "<$trash") or $msg = "notfound";
							 | 
						|
									if ($msg eq 'notfound') {
							 | 
						|
										open( TRACEFILE, ">$trash" ) || return 0;
							 | 
						|
										my $starttime= &format_date_time("yyyy-mm-dd hh:nn:ss GMT", "1", "0");
							 | 
						|
										print TRACEFILE "$starttime\n";
							 | 
						|
										close TRACEFILE;
							 | 
						|
										my $chmodok = chmod 0666, $trash;
							 | 
						|
									} else {
							 | 
						|
										close TRACEFILE;
							 | 
						|
									}
							 | 
						|
									&opentrace();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub traceoutput {
							 | 
						|
									if ($SYSTEM{'traceon'} != 1) {
							 | 
						|
										if (&opentrace()) {
							 | 
						|
											&createtrace();
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									if ($SYSTEM{'traceon'} == 1) {
							 | 
						|
										print TRACEFILE "$_[0]\n";
							 | 
						|
									};
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub opentrace {
							 | 
						|
									my $trash = join( $pathsep, $secroot, "$ENV{'REMOTE_ADDR'}.log");
							 | 
						|
									open( TRACEFILE, ">>$trash" ) || return 0;
							 | 
						|
									$SYSTEM{'traceon'} = 1;
							 | 
						|
									my $starttime= &format_date_time("yyyy-mm-dd hh:nn:ss GMT", "1", "0");
							 | 
						|
									&traceoutput($starttime);
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub closetrace {
							 | 
						|
									$SYSTEM{'traceon'} = 0;
							 | 
						|
									my $starttime= &format_date_time("yyyy-mm-dd hh:nn:ss GMT", "1", "0");
							 | 
						|
									&traceoutput($starttime);
							 | 
						|
									close TRACEFILE;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub createdebug {
							 | 
						|
									$trash = join( $pathsep, $secroot, "debug.$SESSION{'clid'}.txt");
							 | 
						|
									$msg = "";
							 | 
						|
									open( DBGFILE, "<$trash") or $msg = "notfound";
							 | 
						|
									if ($msg eq 'notfound') {
							 | 
						|
										open( DBGFILE, ">$trash" ) || return 0;
							 | 
						|
										$starttime= &format_date_time("yyyy-mm-dd hh:nn:ss GMT", "1", "0");
							 | 
						|
										&dbgprint("$starttime\n");
							 | 
						|
										close DBGFILE;
							 | 
						|
										$chmodok = chmod 0666, $trash;
							 | 
						|
									} else {
							 | 
						|
										close DBGFILE;
							 | 
						|
									}
							 | 
						|
									&opendebug("debug.txt");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub opendebug {
							 | 
						|
									$trash = join( $pathsep, $secroot, "debug.$SESSION{'clid'}.txt");
							 | 
						|
									open( DBGFILE, ">>$trash" ) || return 0;
							 | 
						|
									$debugon = 1;
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub dbgprint {
							 | 
						|
									my ($s) = @_;
							 | 
						|
									&opendebug();
							 | 
						|
									print DBGFILE "$SESSION{'tid'}:$SESSION{'uid'}:$s";
							 | 
						|
									&closedebug();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub closedebug {
							 | 
						|
									$debugon = 0;
							 | 
						|
									close DBGFILE;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub showenv {
							 | 
						|
									for (keys %ENV) {
							 | 
						|
										if ($debugon) {
							 | 
						|
											&dbgprint("$_ = $ENV{$_}\n");
							 | 
						|
										} else {
							 | 
						|
											print "<!-- $_ = $ENV{$_} -->\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$reqmeth = $ENV{'REQUEST_METHOD'};
							 | 
						|
									if ($reqmeth =~ /POST/i) {
							 | 
						|
										read (STDIN, $qstr, $ENV{'CONTENT_LENGTH'});
							 | 
						|
										if ($debugon) {
							 | 
						|
											&dbgprint("POSTED = $qstr\n");
							 | 
						|
										} else {
							 | 
						|
											print "<!-- POSTED = $qstr -->\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_message_with_close {
							 | 
						|
									print "
							 | 
						|
								<HTML>
							 | 
						|
								<BODY>
							 | 
						|
								<CENTER>
							 | 
						|
								$_[0]<BR>
							 | 
						|
								\ <BR>
							 | 
						|
								<FORM>
							 | 
						|
								<INPUT TYPE=SUBMIT VALUE=\"CLOSE\" onClick='window.close()'><BR>
							 | 
						|
								</FORM>
							 | 
						|
								</BODY>
							 | 
						|
								</HTML>
							 | 
						|
								";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								### DED-03 8/6/2002 Added this function to replace show_message_with_close
							 | 
						|
								###	because it would close entire browser window
							 | 
						|
								sub show_message_with_back {
							 | 
						|
									$URL="$PATHS{'cgiroot'}/sadmin.pl?tid=$SESSION{'tid'}&dtl=$_[1]&lang=$FORM{'lang'}";
							 | 
						|
									print "
							 | 
						|
								<HTML>
							 | 
						|
								<BODY>
							 | 
						|
								<CENTER>
							 | 
						|
								$_[0]<BR>
							 | 
						|
								\ <BR>\n";
							 | 
						|
								if ($_[1] == 2) {
							 | 
						|
									print "<a href=$URL target=_parent>BACK</a>\n";
							 | 
						|
								} else {
							 | 
						|
									print "<a href=$URL>BACK</a>\n";
							 | 
						|
								}
							 | 
						|
								print "
							 | 
						|
								</BODY>
							 | 
						|
								</HTML>
							 | 
						|
								";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub file_exists {
							 | 
						|
									open (TMPFILE,"<$_[0]") or return 0;
							 | 
						|
									close TMPFILE;
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub file_exists_with_extension {
							 | 
						|
									@feexts = split(/\;/, $_[1]);
							 | 
						|
									foreach $feext (@feexts) {
							 | 
						|
										$fename = "$_[0].$feext";
							 | 
						|
										if (&file_exists($fename)) {
							 | 
						|
											@feexts = ();
							 | 
						|
											$feext = "";
							 | 
						|
											return $fename;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									@feexts = ();
							 | 
						|
									$feext = "";
							 | 
						|
									$fename = "";
							 | 
						|
									return "";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub app_initialize {
							 | 
						|
									$FORM{servertime} = POSIX::strftime($UI{DATETIME_FMT}, localtime(time));
							 | 
						|
								
							 | 
						|
									# parse request parameters into variables
							 | 
						|
									$query = new CGI;
							 | 
						|
									%FORM = $query->Vars;
							 | 
						|
								
							 | 
						|
									#foreach $key (keys(%FORM)) {
							 | 
						|
										#if ($FORM{$key} =~ /\-\-$/) {
							 | 
						|
											#chop($FORM{$key});
							 | 
						|
											#chop($FORM{$key});
							 | 
						|
										#}
							 | 
						|
									#}
							 | 
						|
								
							 | 
						|
									### DED Rip ALL this out, change UPLOADED_FILES references
							 | 
						|
									###	to use "CGI::upload"
							 | 
						|
								
							 | 
						|
														#if ($ftype eq 'csv') {
							 | 
						|
															#$content =~ s/\r//g;
							 | 
						|
															#$content =~ s/\n\n/\n/g;
							 | 
						|
														#} else {
							 | 
						|
															#### DED 1/24/06 
							 | 
						|
															## Removed for png supt
							 | 
						|
															## but breaks reports
							 | 
						|
															##$content =~ s/(.*)\r\n/$1/;
							 | 
						|
															#$content =~ s/(.*)\r\n/$1/;
							 | 
						|
														#}
							 | 
						|
								
							 | 
						|
								        # make sure connection is https
							 | 
						|
									$set_https = 0;
							 | 
						|
									if ($FORM{'clid'} ne '') {
							 | 
						|
										&get_client_configuration($FORM{'clid'});
							 | 
						|
										$set_https = 0;
							 | 
						|
									} elsif ($FORM{'tid'} ne '' && &get_session($FORM{'tid'})) {
							 | 
						|
										&get_client_configuration($SESSION{'clid'});
							 | 
						|
										$set_https = 0;
							 | 
						|
									}
							 | 
						|
									if ($set_https) {
							 | 
						|
										if ( ($ENV{'HTTPS'} ne "on") && ( ($SYSTEM{'FORCEHTTPSOVERRIDE'} eq "Yes") || ($SYSTEM{'FORCEHTTPSOVERRIDE'} ne "No" && $SYSTEM{'forcehttps'}) ) ) {
							 | 
						|
											$url = "https://".$ENV{'SERVER_NAME'};
							 | 
						|
											if ($ENV{'SERVER_PORT'} != "80") {
							 | 
						|
												$port = $ENV{'SERVER_PORT'} + 1;
							 | 
						|
													$url .= ":".$port;
							 | 
						|
											}
							 | 
						|
											$url .= $ENV{'REQUEST_URI'};
							 | 
						|
											print "Location: $url\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
								        if ($qstr) {
							 | 
						|
										return 1;
							 | 
						|
									} else {
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								sub copy_file {
							 | 
						|
									system("cp $_[1] $_[0] -p");
							 | 
						|
									print "<br>File successfully copied...<br>"; 
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								sub make_file {
							 | 
						|
									if ( ! open (TMPFILE, "<$_[1]") ) {
							 | 
						|
										&logger::logerr("Unable to open $_[1] for reading:  $!\n");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									@copylines = <TMPFILE>;
							 | 
						|
									close TMPFILE;
							 | 
						|
									if ( ! open (TMPFILE, ">$_[0]") ) {
							 | 
						|
										&logger::logerr("Unable to open $_[0] for writing:  $!\n");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									if ($_[2] == 1) {
							 | 
						|
										print TMPFILE "$copylines[0]";
							 | 
						|
									} else {
							 | 
						|
										foreach $copyline (@copylines) {
							 | 
						|
											print TMPFILE "$copyline";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									close TMPFILE;
							 | 
						|
									$chmodok = chmod 0666, $_[0];
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_io_file {
							 | 
						|
									if ( ! open (TMPFILE, "<$_[0]") ) {
							 | 
						|
										&logger::logerr("Unable to open $_[0] for reading:  $!\n");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									@copylines = <TMPFILE>;
							 | 
						|
									close TMPFILE;
							 | 
						|
									if ( ! open (TMPFILE, ">$_[1]") ) {
							 | 
						|
										&logger::logerr("Unable to open $_[1] for writing:  $!\n");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									foreach $copyline (@copylines) {
							 | 
						|
										print TMPFILE "$copyline";
							 | 
						|
									}
							 | 
						|
									close TMPFILE;
							 | 
						|
									$chmodok = chmod 0666, $_[1];
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								############################################################################
							 | 
						|
								#
							 | 
						|
								# Function:  cpbin( $fromfile, $tofile, $opts )
							 | 
						|
								#
							 | 
						|
								# Description:  Perform a binary copy of one binary file to another.
							 | 
						|
								#
							 | 
						|
								# Usage:  cpbin( $fromfile, $tofile, $opts )
							 | 
						|
								#
							 | 
						|
								# 	$opts is a hashref of options as follows:
							 | 
						|
								#
							 | 
						|
								# 		$opts->{clobber} : If set to 1, any existing $tofile will be clobbered.
							 | 
						|
								# 		                   Otherwise, the copy will fail and return 0.
							 | 
						|
								#
							 | 
						|
								# Returns:  1 if successful, 0 if not, with very little error-checking
							 | 
						|
								# 			to prevent accidental clobbering.
							 | 
						|
								#
							 | 
						|
								# Author:  efl, 11/2001
							 | 
						|
								#
							 | 
						|
								############################################################################
							 | 
						|
								sub cpbin {
							 | 
						|
									my($fromfile, $tofile, $opts) = @_;
							 | 
						|
								
							 | 
						|
									my $clobber = $opts->{clobber};
							 | 
						|
								
							 | 
						|
									if ( -f $tofile && ! $clobber ) {
							 | 
						|
										&logger::logerr("Unable to open $fromfile for writing:  File exists and no clobbering allowed.  Set \$opts->{clobber} = 1 to force clobbering.\n");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! open (INFILE, "<$fromfile") ) {
							 | 
						|
										&logger::logerr("Unable to open $fromfile for reading:  $!\n");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									binmode(INFILE);
							 | 
						|
									@content = <INFILE>;
							 | 
						|
									close INFILE;
							 | 
						|
								
							 | 
						|
									if ( ! open (OUTFILE, ">$tofile") ) {
							 | 
						|
										&logger::logerr("Unable to open $tofile for writing:  $!\n");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									binmode(OUTFILE);
							 | 
						|
									foreach $content (@content) {
							 | 
						|
										print OUTFILE $content;
							 | 
						|
									}
							 | 
						|
									close OUTFILE;
							 | 
						|
								
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub gentid {
							 | 
						|
									$coreid = time;
							 | 
						|
									$spfmt = join('', "\%s\%0", sprintf("%d", length($idmax)), "d");
							 | 
						|
									$tid = sprintf( $spfmt, $coreid, (int(rand(0) * $idmax)));
							 | 
						|
									return $tid;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub init_session {
							 | 
						|
									if ($FORM{'clid'} eq 'sacc') { $FORM{'clid'} = 'std';}
							 | 
						|
									$SESSION{'tid'} = &gentid;
							 | 
						|
									$SESSION{'clid'}=$FORM{'clid'};
							 | 
						|
									$SESSION{'uid'}=$FORM{'uid'};
							 | 
						|
									$SESSION{'uac'}=$FORM{'uac'};
							 | 
						|
									$SESSION{'useragent'}=$ENV{'HTTP_USER_AGENT'};
							 | 
						|
									$SESSION{'ipaddr'}=$ENV{'REMOTE_ADDR'};
							 | 
						|
									$SESSION{'referer'}=$ENV{'HTTP_REFERER'};
							 | 
						|
									$SESSION{'home'}=$FORM{'home'};
							 | 
						|
									$SESSION{'lang'}=$FORM{'lang'};
							 | 
						|
									$SESSION{'loggedin'}=time;
							 | 
						|
									if ($FORM{'browser'} eq '') {
							 | 
						|
										if ($SESSION{'useragent'} =~ /MSIE/ ) {
							 | 
						|
											$FORM{'browser'} = "MSIE/4";
							 | 
						|
										} else {
							 | 
						|
											$FORM{'browser'} = "NSNV/4";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									($SESSION{'browserapp'}, $SESSION{'browserversion'}) = split(/\//, $FORM{'browser'});
							 | 
						|
									&put_session($SESSION{'tid'}, "y");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_session {
							 | 
						|
									my ($session_id, $skip_warning) = @_;
							 | 
						|
									if (! defined $session_id) {
							 | 
						|
										warn "HBI Undefined Session id" ;
							 | 
						|
									}
							 | 
						|
									if ($session_id eq "") { 
							 | 
						|
										&show_illegal_access_warning unless ($skip_warning);
							 | 
						|
										warn "HBI Blank Session id" ;
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									unless ($session_id =~ m/^\d{13,15}$/ ) {
							 | 
						|
										# only 13, 14, or 15 digits is OK.
							 | 
						|
										$session_id =~ tr/\000/,/ ; # Replace a null with a comma.
							 | 
						|
										my $err_mesg = "HBI Bad Y Session id $session_id X " . length $session_id . " Z" ;
							 | 
						|
										warn $err_mesg ;
							 | 
						|
										$session_id =~ s/\,.*$// ; # Drop any comma and the fo;;owing characters.
							 | 
						|
									}
							 | 
						|
									$trash = join($pathsep, $logroot, "sess.$session_id");
							 | 
						|
									open (SESSFILE, "<$trash");
							 | 
						|
									@sessrecs = <SESSFILE>;
							 | 
						|
									close SESSFILE;
							 | 
						|
									if ($#sessrecs == -1) {
							 | 
						|
										&show_illegal_access_warning unless ($skip_warning);
							 | 
						|
										warn "HBI No Lines in Session file." ;
							 | 
						|
										return 0;
							 | 
						|
									} else {
							 | 
						|
										foreach $sessrec (@sessrecs) {
							 | 
						|
											chop ($sessrec);
							 | 
						|
											($nm,$vlu)=split(/=/,$sessrec);
							 | 
						|
											$SESSION{$nm} = $vlu;
							 | 
						|
										}
							 | 
						|
										unless ($SESSION{'clid'}) {
							 | 
						|
											warn "HBI Unknown Client ID in Session file." ;
							 | 
						|
										}
							 | 
						|
										unless ($SESSION{'uid'}) {
							 | 
						|
											warn "HBI Unknown Candidate ID in Session file." ;
							 | 
						|
										}
							 | 
						|
										if ($SESSION{'clid'} eq 'sacc') { $SESSION{'clid'} = 'std';}
							 | 
						|
										# FIXME:  AOL's use of dynamically changing IP addresses on each
							 | 
						|
										# FIXME:  successive pageview breaks fails against this scheme.
							 | 
						|
										# DED 2005-11-08 Removed to facilitate round-robin proxies
							 | 
						|
										#$sameuser = ($SESSION{'ipaddr'} eq $ENV{'REMOTE_ADDR'}) ? 1 : 0;
							 | 
						|
										#if ( $SESSION{'ipaddr'} ne $ENV{'REMOTE_ADDR'} ) {
							 | 
						|
										#	&logger::logwarn("SESSION{'ipaddr'} ($SESSION{'ipaddr'}) !== ENV{'REMOTE_ADDR'} ($ENV{'REMOTE_ADDR'}) for session ID $session_id");
							 | 
						|
										#}
							 | 
						|
										#$sameuser = ($SESSION{'loggedout'} ne '') ? 0 : $sameuser;
							 | 
						|
										$sameuser = ($SESSION{'loggedout'} ne '') ? 0 : 1;
							 | 
						|
										if ( $SESSION{'loggedout'} ne '' ) {
							 | 
						|
											&logger::logwarn("SESSION{'loggedout'} ($SESSION{'loggedout'}) !== '' for session ID $session_id ... meaning exactly what??");
							 | 
						|
										}
							 | 
						|
										return $sameuser;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub close_session {
							 | 
						|
									$SESSION{'loggedout'}=time;
							 | 
						|
									&put_session($SESSION{'tid'});
							 | 
						|
									$tofile = join($pathsep, $logroot, "sess.$_[0]");
							 | 
						|
									$archivefile = join($pathsep, $logroot, "sess.$_[0]");
							 | 
						|
									rename $tofile, $archivefile;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub set_session {
							 | 
						|
									my $temp = $_[2];
							 | 
						|
									&get_session($_[0]);
							 | 
						|
									$SESSION{$_[1]} = $temp;
							 | 
						|
									&put_session($_[0]);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub put_session {
							 | 
						|
									if ($_[0] eq "") { 
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									$SESSION{'lastaccess'}=time;
							 | 
						|
									$trash = join($pathsep, $logroot, "sess.$_[0]");
							 | 
						|
									open (SESSFILE, ">$trash");
							 | 
						|
									for (keys %SESSION) {
							 | 
						|
										print SESSFILE "$_\=$SESSION{$_}\n";
							 | 
						|
									}
							 | 
						|
									close SESSFILE;
							 | 
						|
									if ($_[1] eq 'y') { $chmodok = chmod 0666, $trash;}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_illegal_access_warning {
							 | 
						|
									my ($user) = @_;
							 | 
						|
									&send_illegal_attempt;
							 | 
						|
									print "<HTML>\n";
							 | 
						|
									print "<BODY>\n";
							 | 
						|
								        print "\ <BR>\n";
							 | 
						|
									if ($user eq "user") {
							 | 
						|
										print "Attention User:<br>\n";
							 | 
						|
										print "Either your IP address has changed or the session tracking mechanisms have encountered an error. \n"; 
							 | 
						|
										print "Please logoff and contact your administrator for assistance.<BR>\n";
							 | 
						|
									} else {
							 | 
						|
										print "Attention Site Administrators:<br>\n";
							 | 
						|
										print "You have either requested a service that is unavailable at this time, \n";		
							 | 
						|
										print "or else the session tracking mechanisms have encountered an error. \n"; 
							 | 
						|
										print "Please try another selection, or logoff and logon again to reset session tracking.<BR>\n";
							 | 
						|
									}
							 | 
						|
								        print "\ <BR>\n";
							 | 
						|
								        print "\ <BR>\n";
							 | 
						|
								#        print "Attention Hackers:<br>You have attempted to gain access to this secure site \n";
							 | 
						|
								#	print "by bypassing the site security.<BR>\n";
							 | 
						|
								#	print "\ <BR>\n";
							 | 
						|
								#	print "The contents of this site are protected by United States and International copyright laws.<BR>\n";
							 | 
						|
								#	print "The information on this site is proprietary and protected by United States and International information privacy laws.<BR>\n";
							 | 
						|
								#	print "\ <BR>\n";
							 | 
						|
								#	print "This invalid attempt has been logged, the site administrator notified, and your access route traced.<BR>";
							 | 
						|
								#	print "Any further unauthorized access attempts from $ENV{'REMOTE_ADDR'} will result ";
							 | 
						|
								#	print "in further investigation and possible prosecution.<BR>\n";
							 | 
						|
									print "</BODY>\n";
							 | 
						|
									print "</HTML>\n";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub check_admin_profiles {
							 | 
						|
									my ($cndid) = @_;
							 | 
						|
									@aprofs = &get_data("admin.dat");
							 | 
						|
									foreach $aprof (@aprofs) {
							 | 
						|
										($aid, $trash) = split(/&/, $aprof);
							 | 
						|
										if ($aid eq $cndid) { 
							 | 
						|
											return 1;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return 0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub checkinprogress {
							 | 
						|
									my ($clid, $uid) = @_;
							 | 
						|
								
							 | 
						|
								#	FIXME:  This code, which I commented out, is a nagging mystery.  
							 | 
						|
								#   FIXME:  Why was it here?  Can't see how it worked?  -efl, 1/2002
							 | 
						|
								#	$tmpfile = join( $pathsep, $testroot, "inprog", "$uid.dat");
							 | 
						|
								#	open (TMPFILE, "<$tmpfile") || return 0;
							 | 
						|
								#	@pairs = <TMPFILE>;
							 | 
						|
								#	close TMPFILE;
							 | 
						|
								
							 | 
						|
									$testdir = join( $pathsep, $testroot, "inprog");
							 | 
						|
								
							 | 
						|
									if ( ! opendir(DIR, $testdir) ) {
							 | 
						|
										&logger::logerr("Unable to opendir $testdir:  $!");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
								    @filenames = readdir(DIR);
							 | 
						|
									closedir(DIR);
							 | 
						|
								
							 | 
						|
									my @inprogtests = ();
							 | 
						|
									foreach my $srcfile ( @filenames ) {
							 | 
						|
										if ( $srcfile =~ /^$clid\.$uid\.(.*)$/ ) {
							 | 
						|
											my $testid = $1;
							 | 
						|
											#
							 | 
						|
											#  Now check to see if we are within the availability window 
							 | 
						|
											#
							 | 
						|
											if ( &within_availability_window($clid, $testid, time) ) {
							 | 
						|
								
							 | 
						|
								#	FIXME:  Don't actually note the inprogress test file because this code
							 | 
						|
								#	FIXME:  never worked before and was compensated for elsewhere.  If it
							 | 
						|
								#	FIXME:  ain't broke, don't fix it.  If you uncomment the line below,
							 | 
						|
								#	FIXME:  then this code works, but test resumption does not.  -efl, 1/2002
							 | 
						|
								#				push( @inprogtests, $testid );
							 | 
						|
								
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( scalar(@inprogtests) > 1 ) {
							 | 
						|
										&logger::logerr("There are ".scalar(@inprogtests)." tests in progress and available for uid $uid, clid $clid:  [".join(', ', @inprogtests)."].  It was previously assumed this would not happen.  No interface yet to choose which one to resume.");
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
									$FORM{'uac'} = "";
							 | 
						|
									return scalar(@inprogtests);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# returns 1 if current time is within availability window, 0 if not
							 | 
						|
								#
							 | 
						|
								# $time is in secs since 1970...
							 | 
						|
								sub within_availability_window {
							 | 
						|
									my ($clid, $testid, $time) = @_;
							 | 
						|
								
							 | 
						|
									my ($rc, $msg, $start, $end) = get_availability_window($clid, $testid);
							 | 
						|
									if ( ! $rc ) {
							 | 
						|
										&logger::logerr("Unable to retrieve availability window for clid '$clid', testid '$testid':  $msg");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( $time > $start && $time < $end ) {
							 | 
						|
										return 1;
							 | 
						|
									} else {
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_availability_window( $ $ ) {
							 | 
						|
									my ($clid, $testid) = @_;
							 | 
						|
								
							 | 
						|
									my ($rc, $msg, $start, $end) = (0, "N/A", 0, 0);
							 | 
						|
								
							 | 
						|
									### DED 11/19/02 Have to restore original test profile when done
							 | 
						|
									my $holdtestid = $TEST{'id'};
							 | 
						|
								
							 | 
						|
									if ( ! &get_test_profile($clid, $testid) ) {
							 | 
						|
										&logger::logerr("Failed to get profile for clid '$clid', testid '$testid'");
							 | 
						|
										($rc, $msg, $start, $end) = (0, "Failed to retrieve test profile", 0,0);
							 | 
						|
										&get_test_profile($clid, $holdtestid);
							 | 
						|
										return ($rc, $msg, $start, $end);
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									$start = datetime_to_secssince1970( $TEST{availon} );
							 | 
						|
									if ( ! defined($start) ) {
							 | 
						|
										($rc, $msg, $start, $end) = (0, "Unable to parse availability start: [$TEST{availon}]", 0,0);
							 | 
						|
										&logger::logerr("Unable to parse \$TEST{availon} = $TEST{availon}");
							 | 
						|
										&get_test_profile($clid, $holdtestid);
							 | 
						|
										return ($rc, $msg, $start, $end);
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									$end = datetime_to_secssince1970( $TEST{availthru} );
							 | 
						|
									if ( ! defined($end) ) {
							 | 
						|
										($rc, $msg, $start, $end) = (0, "Unable to parse availability end: [$TEST{availthru}]", 0,0);
							 | 
						|
										&logger::logerr("Unable to parse \$TEST{availthru} = $TEST{availthru}");
							 | 
						|
										&get_test_profile($clid, $holdtestid);
							 | 
						|
										return ($rc, $msg, $start, $end);
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									&get_test_profile($clid, $holdtestid);
							 | 
						|
									return (1, $msg, $start, $end);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub checkalreadyloggedin {
							 | 
						|
									$luid = "$_[0].$_[1]";
							 | 
						|
									open (LOGINFILE, "<$logroot/ulog.dat");
							 | 
						|
									@loginrecs = <LOGINFILE>;
							 | 
						|
									close LOGINFILE;
							 | 
						|
									foreach $loginrec (@loginrecs) {
							 | 
						|
										chop $loginrec;
							 | 
						|
										($lguid, $lgupid, $lgutm) = split(/&/, $loginrec);
							 | 
						|
										if ($lguid eq $luid) {
							 | 
						|
											return 1;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									open (LOGINFILE, ">>$logroot/ulog.dat");
							 | 
						|
									print LOGINFILE "$_[0]\&$_[1]\&$$\n";
							 | 
						|
									close LOGINFILE;
							 | 
						|
									return 0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								## v support for wildcard ids
							 | 
						|
								sub IsTaclID {
							 | 
						|
									my ($clid,$taclid,$pwd,$testid) = @_;
							 | 
						|
								
							 | 
						|
									#
							 | 
						|
									# see if there are any test access ids for this client
							 | 
						|
									#
							 | 
						|
									my @taclrecs=&get_data("tacl.$clid");
							 | 
						|
									unless ($#taclrecs > 0) { return 0;}
							 | 
						|
								
							 | 
						|
									#
							 | 
						|
									# now build a list of available tests for the login id given
							 | 
						|
									#
							 | 
						|
									my @flds;
							 | 
						|
									my $lctaclid=lc($taclid);
							 | 
						|
									my $uctaclid=uc($taclid);
							 | 
						|
									my $rec="($taclid|$uctaclid|$lctaclid)\&(.*)\&$pwd\&";
							 | 
						|
									my @trecs=grep( /$rec/, @taclrecs);
							 | 
						|
									my $rec=shift @taclrecs;
							 | 
						|
									@taclrecs=();
							 | 
						|
									unless ($#trecs != -1) { return 0};
							 | 
						|
								
							 | 
						|
									#
							 | 
						|
									# found some matches, now confirm the password to verifry the grep
							 | 
						|
									#
							 | 
						|
									my $taclauthtests="";
							 | 
						|
									my $tsep="";
							 | 
						|
									foreach $tacl (@trecs) {
							 | 
						|
										chop ($tacl);
							 | 
						|
										@flds=split(/&/,$tacl);
							 | 
						|
										if ($flds[2] eq $pwd) {
							 | 
						|
											$taclauthtests=join ('::',$taclauthtests,"$tacl");
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									@trecs=();
							 | 
						|
									unless ($taclauthtests ne '') { return 0};
							 | 
						|
									$taclauthtests = substr($taclauthtests,2);
							 | 
						|
								
							 | 
						|
									#
							 | 
						|
									# There is a list, so verify access for this id
							 | 
						|
									#
							 | 
						|
									###  DED 3/5/04 Added for auto-login support
							 | 
						|
									if ($pwd eq "_____") {
							 | 
						|
										$rec = "$taclid&$testid&$pwd";
							 | 
						|
										@trecs=grep( /$rec/, $taclauthtests);
							 | 
						|
										unless ($#trecs != -1) { return 0};
							 | 
						|
										$SESSION{'taclid'}=get_anon_seqno($clid, $testid);
							 | 
						|
									} else {
							 | 
						|
										$SESSION{'taclid'}="$taclid.$pwd";
							 | 
						|
									}
							 | 
						|
									$SESSION{'taclauthtests'}=$taclauthtests;
							 | 
						|
									$SESSION{'uac'} = "cnd";
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								## ^ support for wildcard ids
							 | 
						|
								
							 | 
						|
								sub verifyaccess {
							 | 
						|
									$FORM{'uac'} = "";
							 | 
						|
								## v support for wildcard ids
							 | 
						|
									if (&IsTaclID($FORM{'clid'},$FORM{'uid'},$FORM{'pwd'},$FORM{'testid'})) {
							 | 
						|
										return 1;
							 | 
						|
									}
							 | 
						|
								## ^ support for wildcard ids
							 | 
						|
									if ($FORM{'tadm'} ne '' || $FORM{'sadm'} ne '') {
							 | 
						|
										$tmpfile = "admin.dat";
							 | 
						|
										($oldpass,$newpass,$confirmpass) = split(/\//, $FORM{'pwd'});
							 | 
						|
									} else {
							 | 
						|
										$oldpass = $FORM{'pwd'};
							 | 
						|
										$newpass = "";
							 | 
						|
										if ($FORM{'cnd'} ne '') {
							 | 
						|
											$tmpfile = "cnd.$FORM{'clid'}";
							 | 
						|
										} else {
							 | 
						|
											# self assessment request
							 | 
						|
											if ($FORM{'sar'} ne '') {
							 | 
						|
												$tmpfile = "sar.$FORM{'clid'}";
							 | 
						|
											} else {$uacerror = 1;}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									unless ($uacerror) {
							 | 
						|
										@pairs = &get_data($tmpfile);
							 | 
						|
										foreach $pair (@pairs) {
							 | 
						|
											chop ($pair);
							 | 
						|
											($id, $pw, $pv, $clid) = split(/&/, $pair);
							 | 
						|
											if ($id eq $FORM{'uid'}) {
							 | 
						|
												if ($pw eq $oldpass) {
							 | 
						|
													if ($FORM{'tadm'} ne '' || $FORM{'sadm'} ne '') {
							 | 
						|
														$FORM{'uac'} = $pv;
							 | 
						|
														$FORM{'clid'} = ($clid eq 'sacc') ? "std" : $clid;
							 | 
						|
														if ($newpass ne '') {
							 | 
						|
															if ($newpass eq $confirmpass) {
							 | 
						|
																if (&change_password($id,$newpass,$pv,$clid)) {
							 | 
						|
																	$SYSTEM{'message'} = "Your password has been changed."
							 | 
						|
																} else {
							 | 
						|
																	$SYSTEM{'message'} = "Your password could not be changed."
							 | 
						|
																}
							 | 
						|
															} else {
							 | 
						|
																$SYSTEM{'pwchange'} = "Your password was not changed. The new password and confirming password did not match."
							 | 
						|
															}
							 | 
						|
														} else {
							 | 
						|
															$SYSTEM{'pwchange'} = ""
							 | 
						|
														}
							 | 
						|
													} else {
							 | 
						|
														@flds = split(/&/, $pair);
							 | 
						|
														#if ($FORM{'sas'} ne '') {
							 | 
						|
														if ($flds[17] eq 'Y') {
							 | 
						|
															$FORM{'uac'} = "sas";
							 | 
						|
															$FORM{'sas'} = "xxx";
							 | 
						|
														} else {
							 | 
						|
															$FORM{'uac'} = "cnd";
							 | 
						|
														}
							 | 
						|
														$FORM{'clid'} = $FORM{'clid'};
							 | 
						|
													}
							 | 
						|
													if ($ipfilter ne '') {
							 | 
						|
														if ($FORM{'uac'} ne 'gadmin') {
							 | 
						|
															if (&ipfilteredaccess($ipfilter,$ENV{'REMOTE_ADDR'})) {
							 | 
						|
																return 1;
							 | 
						|
															} else {
							 | 
						|
																return 0;
							 | 
						|
															}
							 | 
						|
														} else {
							 | 
						|
															return 1;
							 | 
						|
														}
							 | 
						|
													} else { 
							 | 
						|
														$SESSION{'clid'} = $FORM{'clid'};
							 | 
						|
														&get_client_configuration();
							 | 
						|
														if ($SYSTEM{'IP_ACCESS_FILTER'} ne '') {
							 | 
						|
															$SYSTEM{'message'} = "System is Locked Down";
							 | 
						|
															if (($FORM{'uac'} ne 'gadmin') && ($FORM{'uac'} ne 'admin') && ($FORM{'uac'} ne 'madmin')) {
							 | 
						|
																if (&ipfilteredaccess($SYSTEM{'IP_ACCESS_FILTER'},$ENV{'REMOTE_ADDR'})) {
							 | 
						|
																	return 1;
							 | 
						|
																} else {
							 | 
						|
																	return 0;
							 | 
						|
																}
							 | 
						|
															} else {
							 | 
						|
																return 1;
							 | 
						|
															}
							 | 
						|
														} else {
							 | 
						|
															return 1;
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($FORM{'cnd'} ne '') {
							 | 
						|
											$FORM{'tadm'} = "xxx";
							 | 
						|
											$FORM{'cnd'} = "";
							 | 
						|
											if (&verifyaccess) {
							 | 
						|
												if ($ipfilter ne '') {
							 | 
						|
													if ($FORM{'uac'} ne 'gadmin') {
							 | 
						|
														if (&ipfilteredaccess($ipfilter,$ENV{'REMOTE_ADDR'})) {
							 | 
						|
															return 1;
							 | 
						|
														} else { 
							 | 
						|
															if (($SYSTEM{'IP_ACCESS_FILTER'} ne '') && ($FORM{'uac'} ne 'gadmin')) {
							 | 
						|
																if (&ipfilteredaccess($SYSTEM{'IP_ACCESS_FILTER'},$ENV{'REMOTE_ADDR'})) {
							 | 
						|
																	return 1;
							 | 
						|
																} else {
							 | 
						|
																	return 0;
							 | 
						|
																}
							 | 
						|
															} else {
							 | 
						|
																return 1;
							 | 
						|
															}
							 | 
						|
														}
							 | 
						|
													} else {
							 | 
						|
														return 1;
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													return 1;
							 | 
						|
												}
							 | 
						|
											} else {
							 | 
						|
													return 0;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return 0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub change_password {
							 | 
						|
									@rs = &get_data("admin.dat");
							 | 
						|
									$rskp = shift @rs;
							 | 
						|
									foreach $rs (@rs) {
							 | 
						|
										chop ($rs);
							 | 
						|
										($xxid, $xxpw, $xxpv, $xxclid) = split(/&/, $rs);
							 | 
						|
										if ($xxid eq $_[0]) {
							 | 
						|
											$rs = join('&', $_[0], $_[1], $_[2], $_[3]);
							 | 
						|
										}
							 | 
						|
										push @newrs, $rs;
							 | 
						|
									}
							 | 
						|
									@rs = sort @newrs;
							 | 
						|
									@newrs = ();
							 | 
						|
								 	$tmpfile = join($pathsep, $dataroot, "admin.dat");
							 | 
						|
									open (TMPFILE, ">$tmpfile") or return 0;
							 | 
						|
									print TMPFILE "$rskp";
							 | 
						|
									foreach $rs (@rs) {
							 | 
						|
										print TMPFILE "$rs\n";
							 | 
						|
									}
							 | 
						|
									close TMPFILE;
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub eval_logical_html {	
							 | 
						|
									my ($exaction, $value, $exval) = @_;
							 | 
						|
									$exludeflag = 0;
							 | 
						|
									@exvals = split(/\,/, $exval);
							 | 
						|
									foreach $exval (@exvals) {
							 | 
						|
								 		if ($exval eq 'NULL') {
							 | 
						|
								 			$exval = "";
							 | 
						|
								 		}
							 | 
						|
										if ($exaction eq 'INCLUDE') {
							 | 
						|
											$exludeflag = ($value eq $exval) ? 0 : 1;
							 | 
						|
										} else {
							 | 
						|
											$exludeflag = ($value eq $exval) ? 1 : 0;
							 | 
						|
										}
							 | 
						|
										last if($value eq $exval);
							 | 
						|
									}
							 | 
						|
									return $exludeflag;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub xlatline {
							 | 
						|
									my ($xltline, $fh, $escapem, $parse_nop) = @_;  # print translation to filehandle $fh
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									if ($#sifnests == -1) {
							 | 
						|
										$sifnests[0] = 0;
							 | 
						|
										$sifncnt = 0;
							 | 
						|
										$sifnestlevel = 0;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ($xltline =~ /(<%=)NOP_(\S+.*?%>)/i && $parse_nop) {
							 | 
						|
										$xltline =~ s/(<%=)NOP_(\S+.*?%>)/$1$2/g;
							 | 
						|
									}
							 | 
						|
									my $nopopuptag ;
							 | 
						|
								
							 | 
						|
									if ($xltline =~ /<%=SYSTEM\.STARTIF.(.*?)%>/i ) {
							 | 
						|
										($trash, $exstatement) = split(/\?/, $xltline);
							 | 
						|
										($exvar, $exval, $exaction, $trash) = split(/ /, $exstatement);
							 | 
						|
										($exarray, $exkey) = split(/\./, $exvar);
							 | 
						|
										if ($exarray eq 'FORM') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$FORM{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'CLIENT') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$CLIENT{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'GROUP') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$GROUP{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'TEST') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$TEST{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'SUBTEST') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$SUBTEST{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'QUESTION') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$QUESTION{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'GRADEBOOK') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$GRADEBOOK{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'CANDIDATE') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$CANDIDATE{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'SYSTEM') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$SYSTEM{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'UI') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$UI{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'SUBJAREA') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$SUBJAREA{$exkey}, $exval); 
							 | 
						|
										} elsif ($exarray eq 'SESSION') {
							 | 
						|
											$excludeon = &eval_logical_html($exaction,$SESSION{$exkey}, $exval); 
							 | 
						|
										}
							 | 
						|
										if ($sifnests[$sifcnt]) {
							 | 
						|
											$sifncnt++;
							 | 
						|
										} else {
							 | 
						|
											$sifncnt++;
							 | 
						|
											$sifnests[$sifncnt] = $excludeon;
							 | 
						|
											for (1 .. $sifncnt) {
							 | 
						|
												$sifnestlevel = $_;
							 | 
						|
												$excludeon = $sifnests[$_];
							 | 
						|
												last if ($excludeon);
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										return "";
							 | 
						|
									} elsif ($xltline =~ /<%=SYSTEM\.ELSE%>/i ) {
							 | 
						|
										if ($sifnestlevel == $sifncnt) {
							 | 
						|
											$excludeon = ($excludeon) ? 0 : 1;
							 | 
						|
										}
							 | 
						|
										return "";
							 | 
						|
									} elsif ($xltline =~ /<%=SYSTEM\.ENDIF%>/i ) {
							 | 
						|
										$excludeon = 0;
							 | 
						|
										$sifnests[$sifncnt] = 0;
							 | 
						|
										$sifncnt--;
							 | 
						|
										$sifnestlevel = 0;
							 | 
						|
										for (1 .. $sifncnt) {
							 | 
						|
											$sifnestlevel = $_;
							 | 
						|
											$excludeon = $sifnests[$_];
							 | 
						|
											last if ($excludeon);
							 | 
						|
										}
							 | 
						|
										return "";
							 | 
						|
									} else {
							 | 
						|
										if ($excludeon) { return "";}
							 | 
						|
									}
							 | 
						|
									if ($xltline =~ /<%=(.*?)%>/ ) {
							 | 
						|
										if ($xltline =~ /<%=PATHS\.(.*?)%>/i ) {
							 | 
						|
											for (keys %PATHS) {
							 | 
						|
												$repl = $PATHS{$_};
							 | 
						|
												$srch1 = join('', "<%=PATHS.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=SITE.REPORTS%>/) {
							 | 
						|
											&get_site_reports_list($fh);
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=SYSTEM\.(.*?)%>/i ) {
							 | 
						|
											if ($xltline =~ /<%=SYSTEM\.INCLUDEJS (.*?)%>/i ) {
							 | 
						|
												@incsegs = split(/ /, $xltline);
							 | 
						|
												$incjsfile = $incsegs[1];
							 | 
						|
												@incsegs = ();
							 | 
						|
												unless ($incjsfile eq '') {
							 | 
						|
													$incjsfile = join($pathsep, $cfgroot, "js", $incjsfile);
							 | 
						|
													open (TMPJSFILE, "<$incjsfile");
							 | 
						|
													@tmpjslines = <TMPJSFILE>;
							 | 
						|
													close TMPJSFILE;
							 | 
						|
													foreach $tmpjsline (@tmpjslines) {
							 | 
						|
														$tmpjsline = &xlatline($tmpjsline, $fh);
							 | 
						|
													}
							 | 
						|
													@tmpjslines = ();
							 | 
						|
												}
							 | 
						|
												return "";
							 | 
						|
											} elsif ($xltline =~ /<%=SYSTEM\.date%>/i ) {
							 | 
						|
													$repl = `date "+%b %d, %Y"`;
							 | 
						|
													$srch1 = "<%=SYSTEM.date%>";
							 | 
						|
													$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											} else {
							 | 
						|
												for (keys %SYSTEM) {
							 | 
						|
													$repl = $SYSTEM{$_};
							 | 
						|
													$srch1 = join('', "<%=SYSTEM.", $_, "%>");
							 | 
						|
													$xltline =~ s/$srch1/$repl/g;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=SESSION\.(.*?)%>/i ) {
							 | 
						|
											for (keys %SESSION) {
							 | 
						|
												$repl = $SESSION{$_};
							 | 
						|
												$srch1 = join('', "<%=SESSION.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=FORM\.servertime%>/i ) {
							 | 
						|
											$repl = POSIX::strftime($UI{DATETIME_FMT}, localtime(time));
							 | 
						|
											$srch1 = join('', "<%=FORM.servertime%>");
							 | 
						|
											$xltline =~ s/$srch1/$repl/g;
							 | 
						|
										} elsif ($xltline =~ /<%=FORM\.(.*?)%>/i ) {
							 | 
						|
											for (keys %FORM) {
							 | 
						|
												$repl = $FORM{$_};
							 | 
						|
												$srch1 = join('', "<%=FORM.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=TEST_SESSION\.(.*?)%>/i ) {
							 | 
						|
											for (keys %TEST_SESSION) {
							 | 
						|
												$repl = $TEST_SESSION{$_};
							 | 
						|
												$srch1 = join('', "<%=TEST_SESSION.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=SUBTEST\.(.*?)%>/i ) {
							 | 
						|
											for (keys %SUBTEST) {
							 | 
						|
												$repl = $SUBTEST{$_};
							 | 
						|
												$srch1 = join('', "<%=SUBTEST.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=GROUP\.(.*?)%>/i ) {
							 | 
						|
											for (keys %GROUP) {
							 | 
						|
												$repl = $GROUP{$_};
							 | 
						|
												$srch1 = join('', "<%=GROUP.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=SUBJAREA\.(.*?)%>/i ) {
							 | 
						|
											for (keys %SUBJAREA) {
							 | 
						|
												$repl = $SUBJAREA{$_};
							 | 
						|
												$srch1 = join('', "<%=SUBJAREA.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=PHRASE\.(.+?)%>/i) {
							 | 
						|
											while ( $xltline =~ m/<%=PHRASE\.(.+?)%>/ix) { 
							 | 
						|
												my $id = $1; 
							 | 
						|
												$srch1 = join("", "<%=PHRASE.", $id, "%>");  
							 | 
						|
												$repl = GetLanguageElement($SESSION{lang}, $id);
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=GRADEBOOK\.(.*?)%>/i ) {
							 | 
						|
											for (keys %GRADEBOOK) {
							 | 
						|
												$repl = $GRADEBOOK{$_};
							 | 
						|
												$srch1 = join('', "<%=GRADEBOOK.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch1/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=CLIENTS\.Options%>/i ) {
							 | 
						|
											&print_client_options($fh);
							 | 
						|
											return "";
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=CLIENTS\.List%>/) {
							 | 
						|
											$client_list = &print_client_list($fh);
							 | 
						|
											$xltline =~ s/<%=CLIENTS.List%>/$client_list/g;
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=CLIENT\.(.*?)%>/i ) {
							 | 
						|
											if ( $xltline =~ /<%=CLIENT\.REPORTS%>/i) {
							 | 
						|
												&get_client_reports_list($fh, $SESSION{'clid'}, $SESSION{'uid'});
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.TESTS%>/i) {
							 | 
						|
												&print_noncfa_test_options($CLIENT{'clid'}, $fh);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.userlist%>/i) {
							 | 
						|
												&print_client_cnd_options($CLIENT{'clid'}, $fh);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.adminids%>/i) {
							 | 
						|
												&print_client_adminids($CLIENT{'clid'}, $fh);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.forms%>/i) {
							 | 
						|
												&print_client_test_forms($CLIENT{'clid'}, $fh);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.grpowners%>/i) {
							 | 
						|
												&print_group_owners($CLIENT{'clid'}, $fh);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.grpowners_ownedby%>/i) {
							 | 
						|
												&print_group_owners($CLIENT{'clid'}, $fh, 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.registrars_ownedby%>/i) {
							 | 
						|
												&print_registrars($CLIENT{'clid'}, $fh, 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.groups%>/i) {
							 | 
						|
												&print_client_groups($CLIENT{'clid'}, $fh);
							 | 
						|
												return "";
							 | 
						|
								# v sac modification to standardize test sequence inputs
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.cfas%>/i) {
							 | 
						|
												$repl = &print_client_seqtst_list($CLIENT{'clid'},"cfa",$TEST{'dscl'},$fh);
							 | 
						|
												$srch = join('', "<%=CLIENT.", "cfas", "%>");
							 | 
						|
												$xltline =~ s/$srch/$repl/g;
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.profbs%>/i) {
							 | 
						|
												$repl = &print_client_seqtst_list($CLIENT{'clid'},"profb",$TEST{'profb'},$fh);
							 | 
						|
												$srch = join('', "<%=CLIENT.", "profbs", "%>");
							 | 
						|
												$xltline =~ s/$srch/$repl/g;
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.profas%>/i) {
							 | 
						|
												$repl = &print_client_seqtst_list($CLIENT{'clid'},"profa",$TEST{'profa'},$fh);
							 | 
						|
												$srch = join('', "<%=CLIENT.", "profas", "%>");
							 | 
						|
												$xltline =~ s/$srch/$repl/g;
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.srvys%>/i) {
							 | 
						|
												$repl = &print_client_seqtst_list($CLIENT{'clid'},"srvy",$TEST{'srvy'},$fh);
							 | 
						|
												$srch = join('', "<%=CLIENT.", "srvys", "%>");
							 | 
						|
												$xltline =~ s/$srch/$repl/g;
							 | 
						|
								# ^ sac modification to standardize test sequence inputs
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.userlanguageselect%>/i) {
							 | 
						|
												&print_user_language_select($CLIENT{'clid'});
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.userlanguageselectdrop%>/i) {
							 | 
						|
												&print_user_language_select($CLIENT{'clid'},1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.forsaletable%>/i) {
							 | 
						|
												&print_client_forsale_table($CLIENT{'clid'}, 0);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.ordertable%>/i) {
							 | 
						|
												&print_client_forsale_table($CLIENT{'clid'}, 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd1input%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 1, 0, 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd2input%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 2, 0, 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd3input%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 3, 0, 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd4input%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 4, 0, 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd1inputf%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 1, "f", 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd2inputf%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 2, "f", 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd3inputf%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 3, "f", 1);
							 | 
						|
												return "";
							 | 
						|
											} elsif ( $xltline =~ /<%=CLIENT.clcnd4inputf%>/i) {
							 | 
						|
												&print_clcnd_input($CLIENT{'clid'}, 4, "f", 1);
							 | 
						|
												return "";
							 | 
						|
											} else {
							 | 
						|
												for (keys %CLIENT) {
							 | 
						|
													$repl = $CLIENT{$_};
							 | 
						|
													$srch = join('', "<%=CLIENT.", $_, "%>");
							 | 
						|
													$xltline =~ s/$srch/$repl/g;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($line =~ /<%=MADMIN.CLIENTS%>/) {
							 | 
						|
											&get_madmin_client_list($SESSION{'mclid'});
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=INSTANCE\.desc%>/i ) {
							 | 
						|
											$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
											my $repl = &get_a_key("tests.".$SESSION{'clid'}, $TEST{'instanceof'}, "desc");
							 | 
						|
											my $srch = "<%=INSTANCE.desc%>";
							 | 
						|
											$xltline =~ s/$srch/$repl/g;
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=TESTS\.Options%>/i ) {
							 | 
						|
											&print_std_test_options($SESSION{'clid'}, $fh);
							 | 
						|
											return "";
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=TESTS\.inherit%>/i ) {
							 | 
						|
											&print_filtered_test_options("std", $CLIENT{'clid'}, $fh);
							 | 
						|
											return "";
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=TEST\.(.*?)%>/i ) {
							 | 
						|
											for (keys %TEST) {
							 | 
						|
												$repl = $TEST{$_};
							 | 
						|
												$srch = join('', "<%=TEST.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=QUESTION\.(.*?)%>/i ) {
							 | 
						|
											for (keys %QUESTION) {
							 | 
						|
												$repl = $QUESTION{$_};
							 | 
						|
												$repl = escape_special_chars( $repl ) if ( $escapem == 1 );
							 | 
						|
												$srch = join('', "<%=QUESTION.", $_, "%>");
							 | 
						|
												$xltline =~ s/$srch/$repl/g;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										while ($xltline =~ /<%=QUESTIONS_AH\.([0-9]+)\.(.+)%>/ ) {
							 | 
						|
											my $ques_num = $1 ;
							 | 
						|
											my $ques_index = $ques_num - 1 ;
							 | 
						|
											my $ques_key = $2 ;
							 | 
						|
											# warn "Found QUESTIONS_AH num $ques_num index $ques_index key $ques_key \n" ;
							 | 
						|
											$repl = ${$QUESTIONS_AH}[$ques_index]->{$ques_key} ;
							 | 
						|
											if ($OUTPUT_Format eq "RTF") {$repl =~ s/\<br\>/\\par /ig ;}
							 | 
						|
											$repl = &escape_special_chars( $repl ) if ( $escapem == 1 ) ;
							 | 
						|
											$srch = "<%=QUESTIONS_AH." . $ques_num . "." . $ques_key . "%>" ;
							 | 
						|
											$xltline =~ s/$srch/$repl/g ;
							 | 
						|
										}
							 | 
						|
										while ($xltline =~ /<%=QUESTIONS_AG\.([0-9]+)\.(.+)%>/ ) {
							 | 
						|
											my $ques_num = $1 ;
							 | 
						|
											my $ques_index = $ques_num - 1 ;
							 | 
						|
											my $ques_key = $2 ;
							 | 
						|
											# warn "Found QUESTIONS_AG num $ques_num index $ques_index key $ques_key \n" ;
							 | 
						|
											$repl = ${$QUESTIONS_AG}[$ques_index]->{$ques_key} ;
							 | 
						|
											if ($OUTPUT_Format eq "RTF") {$repl =~ s/\<br\>/\\par /ig ;}
							 | 
						|
											$repl = &escape_special_chars( $repl ) if ( $escapem == 1 ) ;
							 | 
						|
											$srch = "<%=QUESTIONS_AG." . $ques_num . "." . $ques_key . "%>" ;
							 | 
						|
											$xltline =~ s/$srch/$repl/g ;
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /(<%=)ESCAPED_(\S+\..*?%>)/i ) {
							 | 
						|
											#
							 | 
						|
											# I needed a way to indicate from within a template that a value
							 | 
						|
											# needs to be escaped for use within an HTML tag.  Thus,
							 | 
						|
											# you may put "ESCAPED_" in front of any template tag
							 | 
						|
											# and it gets removed here, but turns on the escape flag
							 | 
						|
											# for a recursive call to xlatline() and escape_special_chars().
							 | 
						|
											#
							 | 
						|
											# Initially this is only being implemented for %QUESTION,
							 | 
						|
											# but is structured to allow calls to escape_special_chars()
							 | 
						|
											# for other template tag types (see example above). -efl, 2/2002
							 | 
						|
											#
							 | 
						|
											$xltline =~ s/(<%=)ESCAPED_(\S+\..*?%>)/$1$2/g;
							 | 
						|
											return &xlatline($xltline, $fh, 1);
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										if ($xltline =~ /<%=CANDIDATES\.Options%>/i ) {
							 | 
						|
											&print_client_cnd_options($SESSION{'clid'}, $fh);
							 | 
						|
											return "";
							 | 
						|
										}
							 | 
						|
										if ($xltline =~ /<%=CANDIDATE\.(.*?)%>/i ) {
							 | 
						|
											# for (keys %CANDIDATE)   # This is the original code.  It is a loop. HBI 
							 | 
						|
											for (keys %CANDIDATE) {
							 | 
						|
												$srch1 = "<%=CANDIDATE.authtestsoptions%>";
							 | 
						|
												if ($xltline =~ m/$srch1/ ) {
							 | 
						|
													if ($CANDIDATE{'inproglist'} eq '') {
							 | 
						|
														@authtests = split(/\;/, $CANDIDATE{'authlist'});
							 | 
						|
														my $repl = "";
							 | 
						|
														foreach $authtest (@authtests) {
							 | 
						|
															if ($FORM{'testid'} eq "" || $FORM{'testid'} eq "$authtest") {
							 | 
						|
																&get_test_profile($SESSION{'clid'}, $authtest);
							 | 
						|
																#print $fh "<OPTION value=\"$TEST{'pwdtag'}$TEST{'id'}\">$TEST{'desc'}\n";
							 | 
						|
																$repl .= "<OPTION value=\"$TEST{'pwdtag'}$TEST{'popuptag'}$TEST{'id'}\">$TEST{'desc'}\n";
							 | 
						|
															}
							 | 
						|
														}
							 | 
						|
														#return "";
							 | 
						|
														$xltline =~ s/$srch1/$repl/eg;
							 | 
						|
													} else {
							 | 
						|
														@authtests = split(/\;/, $CANDIDATE{'inproglist'});
							 | 
						|
														my $repl = "";
							 | 
						|
														foreach $authtest (@authtests) {
							 | 
						|
															&get_test_profile($SESSION{'clid'}, $authtest);
							 | 
						|
															#print "<OPTION value=\"$TEST{'pwdtag'}$TEST{'id'}\">$TEST{'desc'}\n";
							 | 
						|
															$repl .= "<OPTION value=\"$TEST{'pwdtag'}$TEST{'popuptag'}$TEST{'id'}\">$TEST{'desc'}\n";
							 | 
						|
														}
							 | 
						|
														#return "";
							 | 
						|
														$xltline =~ s/$srch1/$repl/eg;
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												$srch1 = "<%=CANDIDATE.authtestslist%>";
							 | 
						|
												if ($xltline =~ m/$srch1/ ) {
							 | 
						|
													$repl = $CANDIDATE{'authlist'};
							 | 
						|
													$replinprog = "";
							 | 
						|
													$replinprog = $CANDIDATE{'inproglist'};
							 | 
						|
													if ($replinprog ne "") {
							 | 
						|
														$replinprog=join('', $replinprog, '*');
							 | 
						|
														if ($repl eq "") {
							 | 
						|
															$repl=$replinprog;
							 | 
						|
														} else {
							 | 
						|
															$repl = join(';', $repl, $replinprog);
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
													$xltline =~ s/$srch1/$repl/eg;
							 | 
						|
												}
							 | 
						|
												$srch1 = "<%=CANDIDATE.oldtestsoptions%>";
							 | 
						|
												if ($xltline =~ m/$srch1/ ) {
							 | 
						|
													@authtests = split(/\;/, $CANDIDATE{'completedlist'});
							 | 
						|
													my $repl = "";
							 | 
						|
													foreach $authtest (@authtests) {
							 | 
						|
														&get_test_profile($SESSION{'clid'}, $authtest);
							 | 
						|
														$repl .= "<OPTION value=\"$TEST{'emlcndrvwopt'}$TEST{'id'}\">$TEST{'desc'}\n";
							 | 
						|
													}
							 | 
						|
													$xltline =~ s/$srch1/$repl/g;
							 | 
						|
												} 
							 | 
						|
												$srch1 = "<%=CANDIDATE.oldtestslist%>";
							 | 
						|
												if ($xltline =~ m/$srch1/ ) {
							 | 
						|
													$repl = $CANDIDATE{'completedlist'};
							 | 
						|
													$xltline =~ s/$srch1/$repl/g;
							 | 
						|
												}
							 | 
						|
												$srch1 = "<%=CANDIDATE.groups%>";
							 | 
						|
												if ($xltline =~ m/$srch1/ ) {
							 | 
						|
													&print_owned_groups($CLIENT{'clid'}, $CANDIDATE{'cndid'}, $fh);
							 | 
						|
												} else {
							 | 
						|
													$repl = $CANDIDATE{$_};
							 | 
						|
													$srch1 = join('', "<%=CANDIDATE.", $_, "%>");
							 | 
						|
													$xltline =~ s/$srch1/$repl/g;
							 | 
						|
												}
							 | 
						|
								# v sac support for self-registration
							 | 
						|
												$srch1 = "<%=CANDIDATE.selfregistertests%>";
							 | 
						|
												if ($xltline =~ m/$srch1/ ) {
							 | 
						|
													if ($CANDIDATE{'inproglist'} ne '') {
							 | 
						|
														@authtests = split(/\;/, $CANDIDATE{'inproglist'});
							 | 
						|
														foreach $authtest (@authtests) {
							 | 
						|
															&get_test_profile($SESSION{'clid'}, $authtest);
							 | 
						|
															print "<OPTION value=\"$TEST{'pwdtag'}$TEST{'popuptag'}$TEST{'id'}\">$TEST{'desc'}";
							 | 
						|
														}
							 | 
						|
														return "";
							 | 
						|
													} else {
							 | 
						|
														$repl=&get_selfreg_test_list($SESSION{'clid'}, $CANDIDATE{'completedlist'});
							 | 
						|
														$xltline =~ s/$srch1/$repl/g;
							 | 
						|
														$xltline =~ s/\n/<\/option>\n/g;
							 | 
						|
														$xltline =~ s/\n<\/option>\n/\n/g;
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
								# ^ sac support for self-registration
							 | 
						|
										}
							 | 
						|
										$srch1 = "<%=DATE%>";
							 | 
						|
										if ($xltline =~ m/$srch1/ ) {
							 | 
						|
											$repl = &format_date_time("dd-mmm-yyyy", 1, "0");
							 | 
						|
											$xltline =~ s/$srch1/$repl/g;
							 | 
						|
										}
							 | 
						|
										if (!($xltline =~ /(<%=)NOP_(\S+.*?%>)/i)) {
							 | 
						|
											$xltline =~ s/<%=(.*?)%>//g;
							 | 
						|
										}
							 | 
						|
										print $fh "$xltline";
							 | 
						|
									} else {
							 | 
						|
										print $fh "$xltline";
							 | 
						|
									}
							 | 
						|
									return $xltline;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_template {
							 | 
						|
									my ($template_base) = @_;
							 | 
						|
									# warn "Template $template_base Used." ; # HBI Trace template usage.
							 | 
						|
								# v sac check for custom template
							 | 
						|
									if ($SESSION{'clid'} ne '') {
							 | 
						|
										$tmpfile = join($pathsep, $resptmplt, "$SESSION{'clid'}","$template_base.htt");
							 | 
						|
									} elsif ($FORM{'clid'} ne '') {
							 | 
						|
										$tmpfile = join($pathsep, $resptmplt, "$FORM{'clid'}","$template_base.htt");
							 | 
						|
									} else {
							 | 
						|
										$tmpfile = join($pathsep, $resptmplt, "$CLIENT{'clid'}","$template_base.htt");
							 | 
						|
									}
							 | 
						|
								# ^ sac check for custom template
							 | 
						|
									unless (&file_exists($tmpfile)) {
							 | 
						|
										$tmpfile = join($pathsep, $resptmplt, "$template_base.htt");
							 | 
						|
									}
							 | 
						|
								#	&logger::logdbg("Reading template $template_base.htt");
							 | 
						|
									my @locallines;
							 | 
						|
									# FIXME:  This should probably just be done with get_data(). -efl
							 | 
						|
									if ( open (TMPFILE, "<$tmpfile") ) {
							 | 
						|
										@locallines = <TMPFILE>;
							 | 
						|
										close TMPFILE;
							 | 
						|
									} else {
							 | 
						|
										&logger::logerr("Unable to open $tmpfile for reading:  $!");
							 | 
						|
									}
							 | 
						|
									return @locallines;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								############################################################################
							 | 
						|
								#
							 | 
						|
								# Function:  generate_from_template($template_base, $targetfile)
							 | 
						|
								#
							 | 
						|
								# Description:  Read and parse template with name $template_base.htt
							 | 
						|
								#               and output result to $targetfile.
							 | 
						|
								#
							 | 
						|
								# Returns:  1 if successful, 0 if not, with very little error-checking
							 | 
						|
								# 			to prevent accidental clobbering.
							 | 
						|
								#
							 | 
						|
								# Author:  efl, 11/2001
							 | 
						|
								#
							 | 
						|
								############################################################################
							 | 
						|
								sub generate_from_template( $ $ ) {
							 | 
						|
									my ($template_base, $targetfile) = @_;
							 | 
						|
									if ( ! $template_base ) {
							 | 
						|
										&logger::logerr("Unexpectedly undefined template basename; aborting template generation process.");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									if ( ! $targetfile ) {
							 | 
						|
										&logger::logerr("Unexpectedly undefined template target filename; aborting template generation process.");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									if ( ! open (OUTFILE, ">$targetfile") ) {
							 | 
						|
										&logger::logerr("Unable to open template target file '$targetfile': $!");
							 | 
						|
										return 0;
							 | 
						|
									}
							 | 
						|
									@lines = &get_template($template_base);
							 | 
						|
									foreach $line (@lines) {
							 | 
						|
										$line = &xlatline($line, *OUTFILE);
							 | 
						|
									}
							 | 
						|
									close OUTFILE;
							 | 
						|
								
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_template {
							 | 
						|
									my ($base, $fh) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									if (defined($SESSION{'lang'})) {
							 | 
						|
										&LoadLanguage($SESSION{'lang'});
							 | 
						|
									} elsif (defined($FORM{'lang'})) {
							 | 
						|
										&LoadLanguage($FORM{'lang'});
							 | 
						|
									}
							 | 
						|
									@lines = &get_template($base);
							 | 
						|
									foreach $line (@lines) {
							 | 
						|
										$line = &xlatline($line, $fh);
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_admin_request {
							 | 
						|
								        my ($key) = @_;
							 | 
						|
								        &get_template($key);
							 | 
						|
								        @lines = &get_template($key);
							 | 
						|
								        foreach $line (@lines) {
							 | 
						|
								                $line = &xlatline($line);
							 | 
						|
								        }
							 | 
						|
								}
							 | 
						|
								sub get_site_reports_list {
							 | 
						|
									my ($fh) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									@rrecs = &get_data("sitereports.dat");
							 | 
						|
									$nrecs = $#rrecs;
							 | 
						|
									for $i (1 .. $nrecs) {
							 | 
						|
										@flds = split(/&/, $rrecs[$i++]);
							 | 
						|
										print $fh "<OPTION value=\"$flds[0]\">$flds[1]\n";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_client_reports_list {
							 | 
						|
									my ($fh, $cndid, $uid) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									my $isaregistrar = &get_a_key("cnd.$cndid", $uid, "registrar");
							 | 
						|
									@rrecs = &get_data("reports.$SESSION{'clid'}");
							 | 
						|
									$nrecs = $#rrecs;
							 | 
						|
									for $i (1 .. $nrecs) {
							 | 
						|
										@flds = split(/&/, $rrecs[$i++]);
							 | 
						|
										if ($isaregistrar eq 'Y') {
							 | 
						|
											if ($flds[0] ne "ENV" && $flds[0] ne "GROUPS") {
							 | 
						|
												print $fh "<OPTION value=\"$flds[0]\">$flds[1]\n";
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
											print $fh "<OPTION value=\"$flds[0]\">$flds[1]\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Hashs to keep in-memory copies of data files.
							 | 
						|
								# %data_get_data uses a file name for a key, and the value 
							 | 
						|
								#   is a copy of the data file.
							 | 
						|
								# %mtime_get_data uses the same key and the value is a
							 | 
						|
								#   time value for the last known change to the file.
							 | 
						|
								my %mtime_get_data = () ;
							 | 
						|
								my %data_get_data = () ;
							 | 
						|
								
							 | 
						|
								sub get_data {
							 | 
						|
									my ($file, $lock) = @_;
							 | 
						|
								 	$tmpfile = join($pathsep, $dataroot, $file);
							 | 
						|
									if ($lock) { 
							 | 
						|
										$lockfile = join($pathsep, $dataroot, "$file.lock");
							 | 
						|
										while (-e $lockfile) {}
							 | 
						|
										if ( open (LOCKFILE, ">$lockfile") ) {
							 | 
						|
											close LOCKFILE;
							 | 
						|
										} else {
							 | 
						|
											&logger::logerr("get_data: Unable to lock $tmpfile:  $!");
							 | 
						|
											return 0;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									my @locallines; my $local_mtime ;
							 | 
						|
									my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, 
							 | 
						|
											$size, $atime, $mtime, $ctime, $blksize, $blocks) ;
							 | 
						|
									unless($data_get_data{$tmpfile}) {
							 | 
						|
										if ( open (TMPFILE, "<$tmpfile") ) {
							 | 
						|
											@locallines = <TMPFILE>;
							 | 
						|
											($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $local_mtime, $ctime, $blksize, $blocks) = stat TMPFILE ;
							 | 
						|
											close TMPFILE;
							 | 
						|
											$mtime_get_data{$tmpfile} = $local_mtime ;
							 | 
						|
											$data_get_data{$tmpfile} = \@locallines ;
							 | 
						|
										} else {
							 | 
						|
											&logger::logerr("Unable to open $tmpfile for reading:  $!");
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $local_mtime, $ctime, $blksize, $blocks) = stat $tmpfile ;
							 | 
						|
										if ($local_mtime > $mtime_get_data{$tmpfile}) {
							 | 
						|
											# Replace the data values.
							 | 
						|
											if ( open (TMPFILE, "<$tmpfile") ) {
							 | 
						|
												@locallines = <TMPFILE>;
							 | 
						|
												($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $local_mtime, $ctime, $blksize, $blocks) = stat TMPFILE ;
							 | 
						|
												$mtime_get_data{$tmpfile} = -- $local_mtime ;
							 | 
						|
												$data_get_data{$tmpfile} = \@locallines ;
							 | 
						|
												close TMPFILE;
							 | 
						|
												utime $atime, $local_mtime , $tmpfile ;
							 | 
						|
											} else {
							 | 
						|
												&logger::logerr("Unable to open $tmpfile for reading:  $!");
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
											@locallines = @{${data_get_data}{$tmpfile}} ;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return @locallines;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_log {
							 | 
						|
								 	$tmpfile = join($pathsep, $logroot, $_[0]);
							 | 
						|
									open (TMPFILE, "<$tmpfile") or $msg="failed";
							 | 
						|
									@locallines = <TMPFILE>;
							 | 
						|
									close TMPFILE;
							 | 
						|
									return @locallines;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_madmin_client_list {
							 | 
						|
									my ($clients, $fh) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									@clients = split(':', $clients);
							 | 
						|
									for $i (0 .. $#clients) {
							 | 
						|
										$clients[$i] =~ tr/\+/ /;
							 | 
						|
										if ($clients[$i] eq $CLIENT{'clid'}) {
							 | 
						|
											print $fh "<OPTION value=\"$clients[$i]\" selected>$clients[$i]</OPTION>\n";
							 | 
						|
										} else {
							 | 
						|
											print $fh "<OPTION value=\"$clients[$i]\">$clients[$i]</OPTION>\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub regdusr {
							 | 
						|
									my ($template) = @_;
							 | 
						|
									@lines = &get_template($template);
							 | 
						|
									foreach $line (@lines) {
							 | 
						|
										if ($line =~ /<%=SITE.REPORTS%>/) {
							 | 
						|
											&get_site_reports_list;
							 | 
						|
										} elsif ($line =~ /<%=CLIENT.REPORTS%>/) {
							 | 
						|
											&get_client_reports_list(undef, $SESSION{'clid'}, $SESSION{'uid'});
							 | 
						|
										} elsif ($line =~ /<%=MADMIN.CLIENTS%>/) {
							 | 
						|
											&get_madmin_client_list($FORM{'clid'});
							 | 
						|
										} elsif ($line =~ /<%=FORM.testid%>/) {
							 | 
						|
											$line =~ s/<%=FORM.testid%>/$FORM{'testid'}/;
							 | 
						|
											print $line;
							 | 
						|
										} else {
							 | 
						|
											$line = &xlatline($line);
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub send_cookie {
							 | 
						|
									$expdte = &format_date_time("dddd, dd-mmm-yy hh:nn:ss GMT", "1", "2592000");
							 | 
						|
									print "Set-Cookie: $_[0]=$_[1]; DOMAIN=$ENV{'HTTP_HOST'}; path=/~smiadmin/; expires=$expdte\n";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#
							 | 
						|
								# $datetimestring = &format_date_time($formatstring,$timezone,$flag,$value)
							 | 
						|
								#	$formatstring	dd = day
							 | 
						|
								#					mm = month (01,02,...)
							 | 
						|
								#					mmm = month (Jan,Feb,...)
							 | 
						|
								#					yy = year (00,01,...)
							 | 
						|
								#					yyyy = year (2000,2001,...)
							 | 
						|
								#	$timezone = 1 : GMT
							 | 
						|
								#				2 : Local Time
							 | 
						|
								#	$flag	 = 	-1 : time - 1000
							 | 
						|
								#				-10000 : absolute ($value)
							 | 
						|
								#				??? = relative (time + $flag)
							 | 
						|
								#
							 | 
						|
								sub format_date_time {
							 | 
						|
									$sformatted = $_[0];
							 | 
						|
									if ($_[1] == '1') {
							 | 
						|
										if ($_[2]=='-1') {
							 | 
						|
											@tmvalues = gmtime(time-1000);
							 | 
						|
										} else {
							 | 
						|
											if ($_[2]=='-10000') {
							 | 
						|
												@tmvalues = gmtime($_[3]);
							 | 
						|
											} else {
							 | 
						|
												@tmvalues = gmtime(time+$_[2]);
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										if ($_[2]=='-1') {
							 | 
						|
											@tmvalues = localtime(time-1000);
							 | 
						|
										} else {
							 | 
						|
											if ($_[2]=='-10000') {
							 | 
						|
												@tmvalues = localtime($_[3]);
							 | 
						|
											} else {
							 | 
						|
												@tmvalues = localtime(time+$_[2]);
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									$ss = sprintf( "%02d", $tmvalues[0]);
							 | 
						|
									($trash, $ms) = Time::HiRes::gettimeofday();
							 | 
						|
									$nn = sprintf( "%02d", $tmvalues[1]);
							 | 
						|
									$h = sprintf( "%d", $tmvalues[2]);
							 | 
						|
									$hh = sprintf( "%02d", $tmvalues[2]);
							 | 
						|
									$dd = sprintf( "%02d", $tmvalues[3]);
							 | 
						|
									$mm = sprintf( "%02d", $tmvalues[4]+1);
							 | 
						|
									$mmm = format_month($tmvalues[4], "0");
							 | 
						|
									$mmmm = format_month($tmvalues[4], "1");
							 | 
						|
									$yy = format_year($tmvalues[5], "0");
							 | 
						|
									$yyyy = format_year($tmvalues[5], "1");
							 | 
						|
									$ddd = format_day_of_week($tmvalues[6], "0");
							 | 
						|
									$dddd = format_day_of_week($tmvalues[6], "1");
							 | 
						|
								
							 | 
						|
									$sformatted =~ s/ss/$ss/ig;
							 | 
						|
									$sformatted =~ s/ms/$ms/ig;
							 | 
						|
									$sformatted =~ s/nn/$nn/ig;
							 | 
						|
									$sformatted =~ s/hh/$hh/ig;
							 | 
						|
									$sformatted =~ s/h/$h/ig;
							 | 
						|
									$sformatted =~ s/dddd/$dddd/ig;
							 | 
						|
									$sformatted =~ s/ddd/$ddd/ig;
							 | 
						|
									$sformatted =~ s/dd/$dd/ig;
							 | 
						|
									$sformatted =~ s/mmmm/$mmmm/ig;
							 | 
						|
									$sformatted =~ s/mmm/$mmm/ig;
							 | 
						|
									$sformatted =~ s/mm/$mm/ig;
							 | 
						|
									$sformatted =~ s/yyyy/$yyyy/ig;
							 | 
						|
									$sformatted =~ s/yy/$yy/ig;
							 | 
						|
									return $sformatted;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub format_day_of_week {
							 | 
						|
									@dayarray = ( ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
							 | 
						|
										["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] );
							 | 
						|
									return $dayarray[$_[1]][$_[0]];
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub format_month {
							 | 
						|
									@montharray = ( ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
							 | 
						|
										["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] );
							 | 
						|
									return $montharray[$_[1]][$_[0]];
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub format_year {
							 | 
						|
									if ($_[0] > '99') {
							 | 
						|
										if ($_[1] == '0') {
							 | 
						|
											return sprintf("%02d", $_[0]-100);
							 | 
						|
										} else {
							 | 
						|
											return sprintf("%04d", $_[0]+1900);
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										if ($_[1] == '0') {
							 | 
						|
											return sprintf("%02d", $_[0]);
							 | 
						|
										} else {
							 | 
						|
											return sprintf("%04d", $_[0]+1900);
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#
							 | 
						|
								# returns date time values in array elements:
							 | 
						|
								#	0 = seconds	(0-59)
							 | 
						|
								#	1 = minutes	(0-59)
							 | 
						|
								#	2 = hours	(0-23)
							 | 
						|
								#	3 = day		(0-30)
							 | 
						|
								#	4 = month	(0-11)
							 | 
						|
								#	5 = year
							 | 
						|
								#	6 = day of week (0-6)
							 | 
						|
								#	7 = seconds since Jan 1 1970
							 | 
						|
								#
							 | 
						|
								sub compute_date_time {
							 | 
						|
									my ($datestring) = @_;
							 | 
						|
									my @days = ('SUNDAY','MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY');
							 | 
						|
									my @months = ('JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER');
							 | 
						|
									my @ampm = ('A','AM','P','PM');
							 | 
						|
									my $pmflag=0;
							 | 
						|
									my $tm="hns";
							 | 
						|
									my $mm="mdy";
							 | 
						|
									my @dtvalues=();
							 | 
						|
									my @numvals=();
							 | 
						|
									my @numflgs=();
							 | 
						|
									my @chrs=split(//,$datestring);
							 | 
						|
									my $c;
							 | 
						|
									my $h="";
							 | 
						|
									my $i=0;
							 | 
						|
									my $j=0;
							 | 
						|
									my $k=0;
							 | 
						|
									my $l=0;
							 | 
						|
									my $wordnum="";
							 | 
						|
									my $wordstr="";
							 | 
						|
									my $ignorespaces=1;
							 | 
						|
									my $wordbreak=0;
							 | 
						|
									foreach $c (@chrs) {
							 | 
						|
										if (($c eq ' ') && ($ignorespaces)) {
							 | 
						|
											next;
							 | 
						|
										};
							 | 
						|
										$ignorespaces=0;
							 | 
						|
										if ($c =~ /([:\-\/\,\s])/ ) {
							 | 
						|
											$wordbreak=1;
							 | 
						|
											$ignorespaces=1;
							 | 
						|
										} elsif ($c =~ /([a-zA-Z])/ ) {
							 | 
						|
											if ($wordnum eq '') {
							 | 
						|
												$wordstr=join('',$wordstr,"$c");
							 | 
						|
											} else {
							 | 
						|
												$wordbreak = 1;
							 | 
						|
												$h=$c;
							 | 
						|
											}
							 | 
						|
										} elsif ($c =~ /([0-9])/ ) {
							 | 
						|
											if ($wordstr eq '') {
							 | 
						|
												$wordnum = join('',$wordnum,"$c");
							 | 
						|
											} else {
							 | 
						|
												$wordbreak = 1;
							 | 
						|
												$h=$c;
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
										}
							 | 
						|
										$wordbreak = ($c eq $chrs[$#chrs]) ? 1 : $wordbreak;
							 | 
						|
										if ($wordbreak) {
							 | 
						|
											$wordbreak=0;
							 | 
						|
											if ($wordstr ne '') {
							 | 
						|
												$wordstr = uc($wordstr);
							 | 
						|
												# check AMPM and TZ
							 | 
						|
												if (length($wordstr) < 3) {
							 | 
						|
													for $j (0..$#ampm) {
							 | 
						|
														if ($ampm[$j] eq $wordstr) {
							 | 
						|
															$pmflag=($ampm[$j] =~ /P/ ) ? 1: 0;
							 | 
						|
															for $k (0 .. $i) {
							 | 
						|
																if ($numflgs[$k] eq 'h') {
							 | 
						|
																	if ($pmflag) {
							 | 
						|
																		if ($numvals[$k] < 12) {
							 | 
						|
																			$numvals[$k]+=12;
							 | 
						|
																		}
							 | 
						|
																	} else {
							 | 
						|
																		if ($numvals[$k] > 11) {
							 | 
						|
																			$numvals[$k]-=12;
							 | 
						|
																		}
							 | 
						|
																	}
							 | 
						|
																	last;
							 | 
						|
																}
							 | 
						|
															}
							 | 
						|
															last;
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													# check TZ
							 | 
						|
													# check for month
							 | 
						|
													for $j (0..$#months) {
							 | 
						|
														if ($months[$j] =~ /$wordstr/ ) {
							 | 
						|
															$numvals[$i]=$j;
							 | 
						|
															$numflgs[$i]="m";
							 | 
						|
															$mm =~ s/m//;
							 | 
						|
															$i++;
							 | 
						|
															last;
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												$wordstr="";
							 | 
						|
											} else {
							 | 
						|
												if ($c eq ':') {
							 | 
						|
													# time element
							 | 
						|
													$numflgs[$i]=substr($tm,0,1);
							 | 
						|
													$tm=substr($tm,1);
							 | 
						|
												} elsif (($c eq '/') || ($c eq '-')) {
							 | 
						|
													# date element
							 | 
						|
													$numflgs[$i]=$mm;
							 | 
						|
												} else {
							 | 
						|
													$j=$i-1;
							 | 
						|
													if ($numflgs[$j] eq 'n') {
							 | 
						|
														$numflgs[$i]="s";
							 | 
						|
														$tm = s/s//;
							 | 
						|
													} else {
							 | 
						|
														$numflgs[$i]="?";
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												$numvals[$i]=$wordnum;
							 | 
						|
												$wordnum="";
							 | 
						|
												$i++;
							 | 
						|
											}
							 | 
						|
											if ($h ne '') {
							 | 
						|
												if ($h =~ /([a-zA-Z])/ ) {
							 | 
						|
													$wordstr=$h;
							 | 
						|
												} else {
							 | 
						|
													$wordnum=$h;
							 | 
						|
												}
							 | 
						|
												$h="";
							 | 
						|
												$wordbreak = ($c eq $chrs[$#chrs]) ? 1 : 0;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									for $j (0 .. $#numvals) {
							 | 
						|
										$i = $j-1;
							 | 
						|
										$k = $j+1;
							 | 
						|
										if ($numflgs[$j] eq '?') {
							 | 
						|
											if ($j == 0) {
							 | 
						|
												if ($numflgs[$k] eq 'm') {
							 | 
						|
													$numflgs[$j]="d";
							 | 
						|
													$k++;
							 | 
						|
													$numflgs[$k]="y";
							 | 
						|
												}
							 | 
						|
											} elsif ($j == 1) {
							 | 
						|
												if ($numflgs[$i] eq 'm') {
							 | 
						|
													$numflgs[$j]="d";
							 | 
						|
													$numflgs[$k]="y";
							 | 
						|
												}
							 | 
						|
											} else {
							 | 
						|
												if (($j == 2) && ($numflgs[$i] eq 'm')) {
							 | 
						|
													$i--;
							 | 
						|
													if ($numflgs[$i] eq 'mdy') {
							 | 
						|
														$numflgs[$i]="d";
							 | 
						|
														$i++;
							 | 
						|
													}
							 | 
						|
													$numflgs[$j]="y";
							 | 
						|
													next;
							 | 
						|
												}
							 | 
						|
												if ($numflgs[$i] eq 'mdy') {
							 | 
						|
													$i--;
							 | 
						|
													if ($numflgs[$i] eq 'mdy') {
							 | 
						|
														$numflgs[$i]="m";
							 | 
						|
														$numvals[$i]--;
							 | 
						|
														$i++;
							 | 
						|
														$numflgs[$i]="d";
							 | 
						|
														$numflgs[$j]="y";
							 | 
						|
													}
							 | 
						|
												} elsif ($numflgs[$i] eq 'h') {
							 | 
						|
													$numflgs[$j]="n";
							 | 
						|
												} elsif (length($numvals[$j]) >= 4) {
							 | 
						|
													$k=length($numvals[$j]);
							 | 
						|
													$l=$#numflgs+1;
							 | 
						|
													for $i (0 .. $k) {
							 | 
						|
														if ($i == 1) {
							 | 
						|
															$numvals[$l]=substr($numvals[$j],0,2);
							 | 
						|
															$numflgs[$l]="h";
							 | 
						|
															$l++;
							 | 
						|
														} elsif ($i == 3) {
							 | 
						|
															$numvals[$l]=substr($numvals[$j],2,2);
							 | 
						|
															$numflgs[$l]="n";
							 | 
						|
															$l++;
							 | 
						|
														} elsif ($i == 5) {
							 | 
						|
															$numvals[$l]=substr($numvals[$j],4);
							 | 
						|
															$numflgs[$l]="s";
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
													$numvals[$j]="";
							 | 
						|
													$numflgs[$j]="";
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$dtvalues[0]=0;
							 | 
						|
									$dtvalues[1]=0;
							 | 
						|
									$dtvalues[2]=0;
							 | 
						|
									$dtvalues[3]=0;
							 | 
						|
									$dtvalues[4]=0;
							 | 
						|
									$dtvalues[5]=0;
							 | 
						|
									$dtvalues[6]=0;
							 | 
						|
									$dtvalues[7]=0;
							 | 
						|
									$j=0;
							 | 
						|
									for $i (0..$#numvals) {
							 | 
						|
										$dtvalue[$i]=0;
							 | 
						|
										if ($numflgs[$i] eq 's') {
							 | 
						|
											$dtvalues[0]=$numvals[$i];
							 | 
						|
											$j+=int($numvals[$i]);
							 | 
						|
										} elsif ($numflgs[$i] eq 'n') {
							 | 
						|
											$dtvalues[1]=$numvals[$i];
							 | 
						|
											$j+=(int($numvals[$i])*60);
							 | 
						|
										} elsif ($numflgs[$i] eq 'h') {
							 | 
						|
											$dtvalues[2]=$numvals[$i];
							 | 
						|
											$j+=(int($numvals[$i])*3600);
							 | 
						|
										} elsif ($numflgs[$i] eq 'd') {
							 | 
						|
											$dtvalues[3]=$numvals[$i];
							 | 
						|
											$j+=((int($numvals[$i])-1)*86400);
							 | 
						|
										} elsif ($numflgs[$i] eq 'm') {
							 | 
						|
											$dtvalues[4]=$numvals[$i];
							 | 
						|
										} elsif ($numflgs[$i] eq 'y') {
							 | 
						|
											if ($numvals[$i] < 100)  {
							 | 
						|
												if ($numvals[$i] > 69)  {
							 | 
						|
													$numvals[$i]+=1900;
							 | 
						|
												} else {
							 | 
						|
													$numvals[$i]+=2000;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
											$dtvalues[5]=$numvals[$i];
							 | 
						|
											$k=int($numvals[$i])-1970;
							 | 
						|
											$l=($k+2)-(($k+2) % 4);
							 | 
						|
											$l=int($l/4) * 86400;
							 | 
						|
											$j+=(($k*31536000)+$l);
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$j+=compute_month_seconds($dtvalues[5],$dtvalues[4]);
							 | 
						|
									$dtvalues[7]=$j;
							 | 
						|
									return wantarray ? @dtvalues : $j;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub compute_month_seconds {
							 | 
						|
									my ($y,$m) = @_;
							 | 
						|
									my $i;
							 | 
						|
									my $n=0;
							 | 
						|
									my @dpm = (0,31,28,31,30,31,30,31,31,30,31,30);
							 | 
						|
									$y %= 4;
							 | 
						|
									if ($y==0) {
							 | 
						|
										@dpm[2]++;
							 | 
						|
									}
							 | 
						|
									for $i (0 .. $m) {
							 | 
						|
										$n+=$dpm[$i]*86400;
							 | 
						|
									}
							 | 
						|
									return $n;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub log_entry {
							 | 
						|
								#
							 | 
						|
								#	Emergency fix for lost test data
							 | 
						|
								#
							 | 
						|
								#	my ($clid, $uid) = @_;
							 | 
						|
								#	$tmstmp = &format_date_time("dd-mmm-yy hh:nn:ss GMT", "1", "0");
							 | 
						|
								#	@flds = @_;
							 | 
						|
								#	$j = $#flds;
							 | 
						|
								#	$newrec =  $tmstmp;
							 | 
						|
								#	$newrec = join(',', $newrec, $SESSION{'tid'});
							 | 
						|
								#	for $i (2 .. $j) {
							 | 
						|
								#		$newrec = join(',', $newrec, $flds[$i++]);
							 | 
						|
								#	}
							 | 
						|
								#	$logfile = join($pathsep, $logroot, "$clid.$uid");
							 | 
						|
								#	if (open (TMPFILE, ">>$logfile")) {
							 | 
						|
								#		print TMPFILE "$newrec\n";
							 | 
						|
								#		close TMPFILE;
							 | 
						|
								#	} else {
							 | 
						|
								#		open (TMPFILE, ">$logfile");
							 | 
						|
								#		@tmprecs = <TMPFILE>;
							 | 
						|
								#		foreach $tmprec (@tmprecs) {
							 | 
						|
								#			print TMPFILE "$tmprec";
							 | 
						|
								#		}
							 | 
						|
								#		print TMPFILE "$newrec\n";
							 | 
						|
								#		close TMPFILE;
							 | 
						|
								#	}
							 | 
						|
								#	$chmodok = chmod 0666, $logfile;
							 | 
						|
									my ($clid, $uid, $code, $message, $tmstmp) = @_;
							 | 
						|
									my $i;
							 | 
						|
									my $logfile;
							 | 
						|
									my @tmprecs;
							 | 
						|
									my $chmodok;
							 | 
						|
								
							 | 
						|
									if (!$tmstmp) {
							 | 
						|
										$tmstmp = &format_date_time("dd-mmm-yyyy hh:nn:ss.ms GMT", "1", "0");
							 | 
						|
									}
							 | 
						|
									my @flds = @_;
							 | 
						|
									my $j = $#flds;
							 | 
						|
									my $newrec =  $tmstmp;
							 | 
						|
									$newrec = join(',', $newrec, $SESSION{'tid'});
							 | 
						|
									for $i (2 .. $j) {
							 | 
						|
										$newrec = join(',', $newrec, $flds[$i++]);
							 | 
						|
									}
							 | 
						|
									$logfile = join($pathsep, $logroot, "$clid.$uid");
							 | 
						|
									if (open (TMPFILE, ">>$logfile")) {
							 | 
						|
										print TMPFILE "$newrec\n";
							 | 
						|
										close TMPFILE;
							 | 
						|
									} else {
							 | 
						|
										open (TMPFILE, ">$logfile");
							 | 
						|
										@tmprecs = <TMPFILE>;
							 | 
						|
										foreach $tmprec (@tmprecs) {
							 | 
						|
											print TMPFILE "$tmprec";
							 | 
						|
										}
							 | 
						|
										print TMPFILE "$newrec\n";
							 | 
						|
										close TMPFILE;
							 | 
						|
									}
							 | 
						|
									$chmodok = chmod 0666, $logfile;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_client_adminids {
							 | 
						|
									my ($filterid, $fh) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									@adminids = &get_data("admin.dat");
							 | 
						|
									$adminid = $adminids[0];
							 | 
						|
									chop($adminid);
							 | 
						|
									@lstflds = split(/&/, $adminid);
							 | 
						|
									$lstidx = 0;
							 | 
						|
									foreach $lstfld (@lstflds) {
							 | 
						|
										if ($lstfld eq 'uid') { $uididx = $lstidx;}
							 | 
						|
										elsif ($lstfld eq 'clid') { $clididx = $lstidx;}
							 | 
						|
										elsif ($lstfld eq 'uac') { $uacidx = $lstidx;}
							 | 
						|
										$lstidx++;
							 | 
						|
									}
							 | 
						|
									for (1 .. $#adminids) {
							 | 
						|
										$adminid = $adminids[$_];
							 | 
						|
										chop($adminid);
							 | 
						|
										@lstflds = split(/&/, $adminid);
							 | 
						|
										if ($lstflds[$uacidx] eq "madmin") {
							 | 
						|
											$ids{$lstflds[$uididx]} = "m-$lstflds[$clididx]";
							 | 
						|
										} elsif ($lstflds[$clididx] eq $filterid ) {
							 | 
						|
											$ids{$lstflds[$uididx]} = "$lstflds[$clididx]";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									foreach $lstid (keys(%ids)) {
							 | 
						|
										print $fh "<OPTION VALUE=\"$ids{$lstid}\">$lstid</OPTION>\n";
							 | 
						|
									}
							 | 
						|
									@lstflds = ();
							 | 
						|
									@adminids = ();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_client_test_forms {
							 | 
						|
									my ($clientID, $fh) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									$omsg = "";
							 | 
						|
									opendir( DATADIR, $questionroot ) or $omsg="could not open dir $questionroot: $!";
							 | 
						|
									if ($omsg ne "") {
							 | 
						|
										# handle error message
							 | 
						|
										#print $fh "$omsg\n";
							 | 
						|
									} else {
							 | 
						|
										@client_forms = grep { /$clientID.form$/ && -f "$questionroot/$_" } readdir(DATADIR);
							 | 
						|
										closedir(DATADIR);
							 | 
						|
										$numcforms = $#client_forms + 1;
							 | 
						|
										$tests = "";
							 | 
						|
										for ($i=0;$i<$numcforms;$i++) {
							 | 
						|
											my ($test, $trash) = split(/\./, $client_forms[$i]);
							 | 
						|
											$tests .= "\"$test\",";
							 | 
						|
										}
							 | 
						|
										$tests = substr($tests, 0, -1);
							 | 
						|
										print $fh "\tvar forms = new Array($tests)";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub make_group {
							 | 
						|
									$grpfile = join($pathsep, $dataroot, "$_[0].groups");
							 | 
						|
									open (TMPGRP, "<$grpfile") or $mustcreate = 1;
							 | 
						|
									close TMPGRP;
							 | 
						|
									if ($mustcreate == 1) {
							 | 
						|
										$grpfilestd = join($pathsep, $dataroot, "groups.std");
							 | 
						|
										&make_file($grpfile, $grpfilestd, 1);
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_group_owners {
							 | 
						|
									@grpowners = &get_data("cnd.$_[0]");
							 | 
						|
									$grpowner = shift @grpowners;
							 | 
						|
									chop ($grpowner);
							 | 
						|
									@grpflds = split(/&/, $grpowner);
							 | 
						|
									for (1 .. $#grpflds) { $GOFIELDS{$grpflds[$_]} = $_; }
							 | 
						|
									@grpflds = ();
							 | 
						|
									return @grpowners;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_group_owners {
							 | 
						|
									my ($clientID, $fh, $ownedby_flag) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									@grpowners = &get_group_owners($clientID);
							 | 
						|
									$idxid = $GOFIELDS{'cndid'};
							 | 
						|
									$idxnmf = $GOFIELDS{'nmf'};
							 | 
						|
									$idxnmm = $GOFIELDS{'nmm'};
							 | 
						|
									$idxnml = $GOFIELDS{'nml'};
							 | 
						|
									$idxgrpo = $GOFIELDS{'grpowner'};
							 | 
						|
									for (0 .. $#grpowners) {
							 | 
						|
										$grpowner = $grpowners[$_];
							 | 
						|
										chop ($grpowner);
							 | 
						|
										@grpdata = split(/&/, $grpowner);
							 | 
						|
										$selected = "";
							 | 
						|
										if ($grpdata[$idxgrpo] eq 'Y') {
							 | 
						|
											if ($ownedby_flag && $grpdata[$idxid] eq $TEST{'ownedby'}) {
							 | 
						|
												$selected = " SELECTED";
							 | 
						|
											}
							 | 
						|
											print $fh "<OPTION VALUE=\"$grpdata[$idxid]\"$selected>$grpdata[$idxnml], $grpdata[$idxnmf] $grpdata[$idxnmm]</OPTION>\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_registrars {
							 | 
						|
									@registrars = &get_data("cnd.$_[0]");
							 | 
						|
									$registrar = shift @registrars;
							 | 
						|
									chop ($registrar);
							 | 
						|
									@regflds = split(/&/, $registrar);
							 | 
						|
									for (1 .. $#regflds) { $REGFIELDS{$regflds[$_]} = $_; }
							 | 
						|
									@regflds = ();
							 | 
						|
									return @registrars;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_registrars {
							 | 
						|
									my ($clientID, $fh, $ownedby_flag) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									@registrars = &get_registrars($clientID);
							 | 
						|
									$idxid = $REGFIELDS{'cndid'};
							 | 
						|
									$idxnmf = $REGFIELDS{'nmf'};
							 | 
						|
									$idxnmm = $REGFIELDS{'nmm'};
							 | 
						|
									$idxnml = $REGFIELDS{'nml'};
							 | 
						|
									$idxreg = $REGFIELDS{'registrar'};
							 | 
						|
									for (0 .. $#registrars) {
							 | 
						|
										$registrar = $registrars[$_];
							 | 
						|
										chop ($registrar);
							 | 
						|
										@regdata = split(/&/, $registrar);
							 | 
						|
										$selected = "";
							 | 
						|
										if ($regdata[$idxreg] eq 'Y') {
							 | 
						|
											if ($ownedby_flag && $regdata[$idxid] eq $TEST{'ownedby'}) {
							 | 
						|
												$selected = " SELECTED";
							 | 
						|
											}
							 | 
						|
											print $fh "<OPTION VALUE=\"$regdata[$idxid]\"$selected>$regdata[$idxnml], $regdata[$idxnmf] $regdata[$idxnmm]</OPTION>\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_client_groups {
							 | 
						|
									@grpsunsorted = &get_data( "groups.$_[0]");
							 | 
						|
									$grp = shift @grpsunsorted;
							 | 
						|
									@grps = sort @grpsunsorted;
							 | 
						|
									@grpsunsorted = ();
							 | 
						|
									chop ($grp);
							 | 
						|
									@grpflds = split(/&/, $grp);
							 | 
						|
									for (0 .. $#grpflds) { $GRPFIELD{$grpflds[$_]} = $_; }
							 | 
						|
									@grpflds = ();
							 | 
						|
									return @grps;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_group {
							 | 
						|
									@grpcnds = &get_data("cnd.$_[0]");
							 | 
						|
									$grpcnd = $grpcnds[0];
							 | 
						|
									chop ($grpcnd);
							 | 
						|
									$grpcndflds = split(/&/, $grpcnd);
							 | 
						|
									for (0 .. $#grpcndflds) { $GRPMEMFLDS{$grpcndflds[$_]} = $_;}
							 | 
						|
									@grpcndflds = ();
							 | 
						|
									$idxgrpid = $GRPMEMFLDS{'grpid'};
							 | 
						|
									$idxmemid = $GRPMEMFLDS{'cndid'};
							 | 
						|
									$idxmemnme = "$GRPMEMFLDS{'nml'}, $GRPMEMFLDS{'nmf'}, $GRPMEMFLDS{'nmm'}";
							 | 
						|
									for (1 .. $#grpcnds) {
							 | 
						|
										$grpcnd = $grpcnds[$_];
							 | 
						|
										chop ($grp);
							 | 
						|
										@grpcnddata = split(/&/, $grpcnd);
							 | 
						|
										if ($grpcnddata[$idxgrpid] =~ /$_[0].$_[1]/i ) {
							 | 
						|
											
							 | 
						|
										} else {
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# DED 11/9/04
							 | 
						|
								# send clid, grpid
							 | 
						|
								# return array of cndids in group
							 | 
						|
								sub get_group_cnds {
							 | 
						|
									my @groups = &get_client_groups($_[0]);
							 | 
						|
									my $grpid = $_[1];
							 | 
						|
									foreach (@groups) {
							 | 
						|
										my @grp = split(/\&/, $_);
							 | 
						|
										if ($grp[1] eq "$grpid") {
							 | 
						|
											my @cnds = split(/\,/,$grp[3]);
							 | 
						|
											return @cnds;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_owned_groups {
							 | 
						|
									@ownedgrps = ();
							 | 
						|
									@grps = &get_client_groups($_[0]);
							 | 
						|
									foreach $grp (@grps) {
							 | 
						|
										if ($grp =~ /$_[0].$_[1].(\.\*)\&/i ) {
							 | 
						|
											push @ownedgrps, $grp;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									@grps = ();
							 | 
						|
									return @ownedgrps;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_client_groups {
							 | 
						|
									my ($clientID, $fh) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									@cligrps = &get_client_groups($clientID);
							 | 
						|
									$idxid = $GRPFIELD{'grpid'};
							 | 
						|
									$idxdesc = $GRPFIELD{'grpdesc'};
							 | 
						|
									for (0 .. $#cligrps) {
							 | 
						|
										$grp = $cligrps[$_];
							 | 
						|
										chop ($grp);
							 | 
						|
										@grpdata = split(/&/, $grp);
							 | 
						|
										print $fh "<OPTION VALUE=\"$grpdata[$idxid]\">$grpdata[$idxdesc]\n";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_owned_groups {
							 | 
						|
									@cligrps = &get_owned_groups($_[0], $_[1]);
							 | 
						|
									my $fh = (defined($_[2]) ? $_[2] : *STDOUT);
							 | 
						|
									$idxid = $GRPFIELD{'grpid'};
							 | 
						|
									$idxdesc = $GRPFIELD{'grpdesc'};
							 | 
						|
									for (1 .. $#cligrps) {
							 | 
						|
										$grp = $cligrps[$_];
							 | 
						|
										chop ($grp);
							 | 
						|
										@grpdata = split(/&/, $grp);
							 | 
						|
										print $fh "<OPTION VALUE=\"$grpdata[$idxid]\">$grpdata[$idxdesc]\n";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								$SYSTEM{'years'} = "<OPTION VALUE=\"2009\">2009
							 | 
						|
								<OPTION VALUE=\"2010\">2010
							 | 
						|
								<OPTION VALUE=\"2011\">2011
							 | 
						|
								<OPTION VALUE=\"2012\">2012
							 | 
						|
								<OPTION VALUE=\"2013\">2013
							 | 
						|
								<OPTION VALUE=\"2014\">2014
							 | 
						|
								<OPTION VALUE=\"2015\">2015
							 | 
						|
								<OPTION VALUE=\"2016\">2016
							 | 
						|
								";
							 | 
						|
								
							 | 
						|
								$SYSTEM{'months'} = "<OPTION VALUE=\"01\">Jan
							 | 
						|
								<OPTION VALUE=\"02\">Feb
							 | 
						|
								<OPTION VALUE=\"03\">Mar
							 | 
						|
								<OPTION VALUE=\"04\">Apr
							 | 
						|
								<OPTION VALUE=\"05\">May
							 | 
						|
								<OPTION VALUE=\"06\">Jun
							 | 
						|
								<OPTION VALUE=\"07\">Jul
							 | 
						|
								<OPTION VALUE=\"08\">Aug
							 | 
						|
								<OPTION VALUE=\"09\">Sep
							 | 
						|
								<OPTION VALUE=\"10\">Oct
							 | 
						|
								<OPTION VALUE=\"11\">Nov
							 | 
						|
								<OPTION VALUE=\"12\">Dec
							 | 
						|
								";
							 | 
						|
								$SYSTEM{'days'} = "<OPTION VALUE=\"01\">01
							 | 
						|
								<OPTION VALUE=\"02\">02
							 | 
						|
								<OPTION VALUE=\"03\">03
							 | 
						|
								<OPTION VALUE=\"04\">04
							 | 
						|
								<OPTION VALUE=\"05\">05
							 | 
						|
								<OPTION VALUE=\"06\">06
							 | 
						|
								<OPTION VALUE=\"07\">07
							 | 
						|
								<OPTION VALUE=\"08\">08
							 | 
						|
								<OPTION VALUE=\"09\">09
							 | 
						|
								<OPTION VALUE=\"10\">10
							 | 
						|
								<OPTION VALUE=\"11\">11
							 | 
						|
								<OPTION VALUE=\"12\">12
							 | 
						|
								<OPTION VALUE=\"13\">13
							 | 
						|
								<OPTION VALUE=\"14\">14
							 | 
						|
								<OPTION VALUE=\"15\">15
							 | 
						|
								<OPTION VALUE=\"16\">16
							 | 
						|
								<OPTION VALUE=\"17\">17
							 | 
						|
								<OPTION VALUE=\"18\">18
							 | 
						|
								<OPTION VALUE=\"19\">19
							 | 
						|
								<OPTION VALUE=\"20\">20
							 | 
						|
								<OPTION VALUE=\"21\">21
							 | 
						|
								<OPTION VALUE=\"22\">22
							 | 
						|
								<OPTION VALUE=\"23\">23
							 | 
						|
								<OPTION VALUE=\"24\">24
							 | 
						|
								<OPTION VALUE=\"25\">25
							 | 
						|
								<OPTION VALUE=\"26\">26
							 | 
						|
								<OPTION VALUE=\"27\">27
							 | 
						|
								<OPTION VALUE=\"28\">28
							 | 
						|
								<OPTION VALUE=\"29\">29
							 | 
						|
								<OPTION VALUE=\"30\">30
							 | 
						|
								<OPTION VALUE=\"31\">31
							 | 
						|
								";
							 | 
						|
								
							 | 
						|
								$SYSTEM{'hours'} = "<OPTION VALUE=\"1\">1
							 | 
						|
								<OPTION VALUE=\"2\">2
							 | 
						|
								<OPTION VALUE=\"3\">3
							 | 
						|
								<OPTION VALUE=\"4\">4
							 | 
						|
								<OPTION VALUE=\"5\">5
							 | 
						|
								<OPTION VALUE=\"6\">6
							 | 
						|
								<OPTION VALUE=\"7\">7
							 | 
						|
								<OPTION VALUE=\"8\">8
							 | 
						|
								<OPTION VALUE=\"9\">9
							 | 
						|
								<OPTION VALUE=\"10\">10
							 | 
						|
								<OPTION VALUE=\"11\">11
							 | 
						|
								<OPTION VALUE=\"12\">12
							 | 
						|
								";
							 | 
						|
								
							 | 
						|
								$SYSTEM{'minutes'} = "<OPTION VALUE=\"00\">00
							 | 
						|
								<OPTION VALUE=\"5\">05
							 | 
						|
								<OPTION VALUE=\"10\">10
							 | 
						|
								<OPTION VALUE=\"15\">15
							 | 
						|
								<OPTION VALUE=\"20\">20
							 | 
						|
								<OPTION VALUE=\"25\">25
							 | 
						|
								<OPTION VALUE=\"30\">30
							 | 
						|
								<OPTION VALUE=\"35\">35
							 | 
						|
								<OPTION VALUE=\"40\">40
							 | 
						|
								<OPTION VALUE=\"45\">45
							 | 
						|
								<OPTION VALUE=\"50\">50
							 | 
						|
								<OPTION VALUE=\"55\">55
							 | 
						|
								";
							 | 
						|
								
							 | 
						|
								$SYSTEM{'pmoffset'} = "<OPTION VALUE=\"00\">AM
							 | 
						|
								<OPTION VALUE=\"12\">PM
							 | 
						|
								";
							 | 
						|
								
							 | 
						|
								# <ACTSEMBED='filename' ALIGN=TOP|BOTTOM|INSERT NUMBER=BEFORE|AFTER>
							 | 
						|
								sub merg_exhibit_in_text {
							 | 
						|
									$beginKeep = 0;
							 | 
						|
									$tmptext = $_[0];
							 | 
						|
									$findtext = "<ACTSEMBED=(.*)>";
							 | 
						|
									if ($tmptext =~ /$findtext/i ) {
							 | 
						|
										$findtext = "<ACTS";
							 | 
						|
										($toptext,$exhcmd) = split(/$findtext/, $tmptext);
							 | 
						|
										($exhcmd,$bottomtext) = split(/>/, $exhcmd);
							 | 
						|
										lc($exhcmd);
							 | 
						|
										@parms = split(/ /, $exhcmd);
							 | 
						|
										foreach $parm (@parms) {
							 | 
						|
											$parm =~ s/ //g;
							 | 
						|
											($nme,$vlu) = split(/=/, $parm);
							 | 
						|
											if (($nme ne '') && ($vlu ne '')) {
							 | 
						|
												lc($nme);
							 | 
						|
												lc($vlu);
							 | 
						|
												$EXHIBIT_PARM{$nme} = $vlu;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										if ($EXHIBIT_PARM{'EMBED'} ne '') {
							 | 
						|
											$prefile = join($pathsep, $questionroot, "actsexhibit", $EXHIBIT_PARM{'EMBED'});
							 | 
						|
											$exhfile = &file_exists_with_extension($prefile, "htt;htm;html");
							 | 
						|
											if ($exhfile ne '') {
							 | 
						|
												open(EXHFILE, "<$exhfile");
							 | 
						|
												@exhlines = <EXHFILE>;
							 | 
						|
												close EXHFILE;
							 | 
						|
												$instext = "\n";
							 | 
						|
												foreach $exhline (@exhlines) {
							 | 
						|
													if ($exhline =~ /<BODY/i) {
							 | 
						|
														$beginKeep=1;
							 | 
						|
													} else {
							 | 
						|
														if ($beginKeep) {
							 | 
						|
															if ($exhline =~ /BODY>/i) {
							 | 
						|
																$beginKeep=0;
							 | 
						|
															} else {
							 | 
						|
																$instext = join('', $instext, $exhline);
							 | 
						|
															}
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												if ($EXHIBIT_PATM{'align'} eq 'bottom') {
							 | 
						|
													$tmptext = join('',  $_[0], $instext);
							 | 
						|
												} elsif ($EXHIBIT_PATM{'align'} eq 'insert') {
							 | 
						|
													$tmptext = join('',  $toptext, $instext, $bottomtext);
							 | 
						|
												} else {
							 | 
						|
													$tmptext = join('', $instext,  $_[0]);
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return $tmptext;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# @phrases = &get_phrases(_LANGUAGE_ID);
							 | 
						|
								sub get_phrases {
							 | 
						|
									my ($lang) = @_;
							 | 
						|
									$tmpfile = join($pathsep, $secroot, "language", "phrases.$lang");
							 | 
						|
									if ( ! open (TMPFILE, "<$tmpfile") ) {
							 | 
						|
										&logger::logerr("Unable to read $tmpfile: $!");
							 | 
						|
										return ();
							 | 
						|
									}
							 | 
						|
									@locallines = <TMPFILE>;
							 | 
						|
									close TMPFILE;
							 | 
						|
									return @locallines;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# @phrases = &put_phrases($languageid);
							 | 
						|
								sub put_phrases {
							 | 
						|
									$tmpfile = join($pathsep, $secroot, "language", "phrases.$_[0]");
							 | 
						|
									open (TMPFILE, ">$tmpfile") or return 0;
							 | 
						|
									for (0 .. $#sTranslation) {
							 | 
						|
										print TMPFILE "$sTranslation[$_]\n";
							 | 
						|
									}
							 | 
						|
									close TMPFILE;
							 | 
						|
									return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# 
							 | 
						|
								# $access = &ipfilteredaccess($filtermasks, $visitorip);
							 | 
						|
								#
							 | 
						|
								#	RETURNS 0 = access denied
							 | 
						|
								#		1 = access permitted
							 | 
						|
								#
							 | 
						|
								# ipaddress filters can be submitted in pairs separated by a comma
							 | 
						|
								#	xxxx:nnn.sss.bbb.mmm,xxxx:nnn.sss.bbb.mmm
							 | 
						|
								#  	x = A (absolute match of segment required) 
							 | 
						|
								#     	x = M (masked LOGICAL AND match of segment required)
							 | 
						|
								#  	if x is omitted, all segments are treated as masked.
							 | 
						|
								#
							 | 
						|
								sub ipfilteredaccess {
							 | 
						|
									my $visitor = $_[1];
							 | 
						|
									my $visitortocheck = $_[1];
							 | 
						|
									my @filters = split(/\,/, $_[0]);
							 | 
						|
									my @rslt = ();
							 | 
						|
									my @filtersegs = ();
							 | 
						|
									my @applymask = ();
							 | 
						|
									my @visitsegs = split(/\./, $visitor);
							 | 
						|
									my $filter = "";
							 | 
						|
									foreach $filter (@filters) {
							 | 
						|
										(my $segeval, my $ipmask) = split(/:/, lc($filter));
							 | 
						|
										if ($ipmask eq '') { $ipmask = $segeval; $segeval="MMMM";}
							 | 
						|
										@filtersegs = split(/\./, $ipmask);
							 | 
						|
										@applymask = split(//,$segeval);
							 | 
						|
										for (0 .. $#filtersegs) {
							 | 
						|
											use integer;
							 | 
						|
											if ($applymask[$_] eq "A") {
							 | 
						|
												@rslt[$_] = ($visitsegs[$_] eq $filtersegs[$_]) ? $visitsegs[$_] : 0;
							 | 
						|
										} elsif ($applymask[$_] eq "M") {
							 | 
						|
												@rslt[$_] = int($visitsegs[$_]) & int($filtersegs[$_]);
							 | 
						|
											} else {
							 | 
						|
												@rslt[$_] = 0;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										$visitor = "$rslt[0].$rslt[1].$rslt[2].$rslt[3]";
							 | 
						|
										@rslt = ();
							 | 
						|
										@filtersegs = ();
							 | 
						|
										@applymask = ();
							 | 
						|
										if ($visitor eq $visitortocheck) {
							 | 
						|
											@filters = ();
							 | 
						|
											return 1;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									@filters = ();
							 | 
						|
									return 0;
							 | 
						|
								}
							 | 
						|
								## v support for self-registration
							 | 
						|
								sub setbrowsertype {
							 | 
						|
									$SESSION{'useragent'}=$ENV{'HTTP_USER_AGENT'};
							 | 
						|
									if ($FORM{'browser'} eq '') {
							 | 
						|
										if ($SESSION{'useragent'} =~ /MSIE/ ) {
							 | 
						|
											$FORM{'browser'} = "MSIE/4";
							 | 
						|
										} else {
							 | 
						|
											$FORM{'browser'} = "NSNV/4";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									($SESSION{'browserapp'}, $SESSION{'browserversion'}) = split(/\//, $FORM{'browser'});
							 | 
						|
								}
							 | 
						|
								## ^ support for self-registration
							 | 
						|
								
							 | 
						|
								## v sac modification to standardize test sequence inputs
							 | 
						|
								sub print_client_seqtst_list {
							 | 
						|
									my ($clid, $tseq, $tdefault, $fh) = @_;
							 | 
						|
									$fh = (defined($fh) ? $fh : *STDOUT);
							 | 
						|
									my @recs=();
							 | 
						|
									my @trecs=();
							 | 
						|
									my $grepfor;
							 | 
						|
									my $rec;
							 | 
						|
									my $id;
							 | 
						|
									my $desc;
							 | 
						|
									my $tmd;
							 | 
						|
									my $maxtm;
							 | 
						|
									my $seq;
							 | 
						|
									my $etc;
							 | 
						|
									my $html;
							 | 
						|
									my $selected="";
							 | 
						|
								
							 | 
						|
									if ($tseq eq 'cfa') {
							 | 
						|
										$grepfor="(.*)\&cfa\&(.*)";
							 | 
						|
									} elsif (($tseq eq 'profb') || ($tseq eq 'profa')) {
							 | 
						|
										$grepfor="(.*)\&(std|svy|dmg|adp)\&(.*)";
							 | 
						|
									} elsif ($tseq eq 'srvy') {
							 | 
						|
										$grepfor="(.*)\&(std|svy|dmg|adp)\&(.*)";
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									@recs = &get_data("tests.$clid");
							 | 
						|
									$rec = shift @recs;
							 | 
						|
									if ($#recs != -1) {
							 | 
						|
										@trecs=grep( /$grepfor/, @recs);
							 | 
						|
										if ($#trecs != -1) {
							 | 
						|
											@recs=();
							 | 
						|
											foreach $rec (@trecs) {
							 | 
						|
												($id,$desc,$tmd,$maxtm,$seq,$etc)=split(/&/, $rec);
							 | 
						|
												if (($grepfor =~ /$seq/i) && ($id ne $TEST{'id'})) {
							 | 
						|
													$rec = join('&',$desc,$id);
							 | 
						|
													push @recs, $rec;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
											if ($#recs != -1) {
							 | 
						|
												@trecs=@recs;
							 | 
						|
												@recs = sort @trecs;
							 | 
						|
												@trecs=();
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$seq = ($tseq eq 'cfa') ? 'dscl' : $tseq;
							 | 
						|
									$html="<select name=\"$seq\">\n";
							 | 
						|
									foreach $rec (@recs) {
							 | 
						|
										($desc,$id)=split(/&/, $rec);
							 | 
						|
										$selected = ($id eq $tdefault) ? " selected" : "";
							 | 
						|
										$html= join('',$html,"<option value=\"$id\"$selected>$desc\n");
							 | 
						|
										@flds=();
							 | 
						|
									}
							 | 
						|
									if ($tdefault eq '') {
							 | 
						|
										$html= join('',$html,"<option value=\"\" selected>None\n");
							 | 
						|
									} else {
							 | 
						|
										$html= join('',$html,"<option value=\"\">None\n");
							 | 
						|
									}
							 | 
						|
									$html= join('',$html,"</select><br>\n");
							 | 
						|
									return $html;
							 | 
						|
								}
							 | 
						|
								## ^ sac modification to standardize test sequence inputs
							 | 
						|
								
							 | 
						|
								sub print_user_language_select {
							 | 
						|
									my ($clid, $dropdown) = @_;
							 | 
						|
									@allowed_langs = split(/,/, $SYSTEM{'ALLOWEDLANGS'});
							 | 
						|
									if ($CLIENT{'cllangflags'} eq "Y" && $dropdown != 1) {
							 | 
						|
										print "$xlatphrase[541]<BR>\n";
							 | 
						|
										foreach $lang (@allowed_langs) {
							 | 
						|
											print "<a href=\"#top\" name=\"$LANGUAGE_ID{$lang}\" onClick=\"return language_select('$lang')\">\n";
							 | 
						|
											print "<img src=\"$graphroot/$LANGUAGE_FLAG{$lang}\" border=0 Alt=\"$LANGUAGE_ID{$lang}\"></a>\n";
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										print " $xlatphrase[833] <BR>\n";
							 | 
						|
										print "<SELECT NAME=\"sellang\" onChange=\"return language_select(this.value)\">\n";
							 | 
						|
										foreach $lang (@allowed_langs) {
							 | 
						|
											$selected = ($lang eq $FORM{'lang'}) ? " SELECTED" : "";
							 | 
						|
											print "	<OPTION VALUE=\"$lang\"$selected>$LANGUAGE_ID{$lang}</OPTION>\n";
							 | 
						|
										}
							 | 
						|
										print "</SELECT>\n";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_client_forsale_table {
							 | 
						|
									my ($clid, $order) = @_;
							 | 
						|
									my $total = 0;
							 | 
						|
									print "<TABLE BORDER=1>\n";
							 | 
						|
									print "<TR>\n";
							 | 
						|
									if ($order == 0) {
							 | 
						|
										print "\t<TH>Purchase</TH>";
							 | 
						|
									}
							 | 
						|
									print "<TH>Item</TH><TH>Price</TH><TH>Duration</TH>\n";
							 | 
						|
									print "</TR>\n";
							 | 
						|
									### tstid&tname&description&cost&duration
							 | 
						|
									@forsale = &get_data("forsale.".$CLIENT{'clid'});
							 | 
						|
									shift(@forsale);
							 | 
						|
									my $i=0;
							 | 
						|
									my $orderlist="";
							 | 
						|
									foreach $item (@forsale) {
							 | 
						|
										@details = split('\&', $item);
							 | 
						|
										if ($order == 1 ) {
							 | 
						|
											if ($FORM{"checkbox".$i++} eq $details[0]) { 
							 | 
						|
												$orderlist .= "$details[0]\;";
							 | 
						|
											} else {
							 | 
						|
												next; 
							 | 
						|
												
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										print "<TR>\n";
							 | 
						|
										if ($order == 0) {
							 | 
						|
											print "\t<TD align=center>\n";
							 | 
						|
											print "\t\t<input type=checkbox name=checkbox".$i++." value=$details[0]>\n";
							 | 
						|
											print "\t</TD>\n";
							 | 
						|
										} else {
							 | 
						|
											$total += $details[4];
							 | 
						|
										}
							 | 
						|
										print "\t<TD>\n";
							 | 
						|
										print "\t\t<b>$details[2]</b><br>\n";
							 | 
						|
										print "\t\t$details[3]\n";
							 | 
						|
										print "\t</TD>\n";
							 | 
						|
										print "\t<TD align=center>\n";
							 | 
						|
										print "\t\t".sprintf(" \$%0.2f", $details[4])." \n";
							 | 
						|
										print "\t</TD>\n";
							 | 
						|
										print "\t<TD align=center>\n";
							 | 
						|
										if ($details[5] == 365) {
							 | 
						|
											print "\t\t1 year\n";
							 | 
						|
										} else {
							 | 
						|
											print "\t\t$details[5] days\n";
							 | 
						|
										}
							 | 
						|
										print "\t</TD>\n";
							 | 
						|
										print "</TR>\n";
							 | 
						|
									}
							 | 
						|
									if ($order == 1) {
							 | 
						|
										$total = sprintf("%0.2f", $total);
							 | 
						|
										print "<TR>\n";
							 | 
						|
										print "\t<TD colspan=3 align=right>\n";
							 | 
						|
										print "\t\t<b>Total:</b> \n";
							 | 
						|
										print "\t\t\$$total\n";
							 | 
						|
										print "\t</TD>\n";
							 | 
						|
										print "</TR>\n";
							 | 
						|
										print "</TABLE>\n";
							 | 
						|
										print "<INPUT TYPE=HIDDEN NAME=\"OrderID\" VALUE=\"\">\n";
							 | 
						|
								                print "<INPUT TYPE=HIDDEN NAME=\"total\" VALUE=\"$total\">\n";
							 | 
						|
								                print "<INPUT TYPE=HIDDEN NAME=\"orderlist\" VALUE=\"$orderlist\">\n";
							 | 
						|
										$url = "https://".$ENV{'SERVER_NAME'};
							 | 
						|
										if ($ENV{'SERVER_PORT'} != 443) {
							 | 
						|
											$url .= ":".$ENV{'SERVER_PORT'};
							 | 
						|
										}
							 | 
						|
										$url .= "/cgi-bin/shop.pl";
							 | 
						|
										print "<INPUT TYPE=HIDDEN NAME=URL VALUE=$url>\n";
							 | 
						|
									} else {
							 | 
						|
										print "</TABLE>\n";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								## v sac relocated and renamed general support functions
							 | 
						|
								# originally named sub get_file_to_html_string{ moved from tstart.pl
							 | 
						|
								sub get_file_html_body {
							 | 
						|
									my($filename) = @_;
							 | 
						|
									my $exhline;
							 | 
						|
									open(AFILE, "<$filename");
							 | 
						|
									my @exhlines = <AFILE>;
							 | 
						|
									close AFILE;
							 | 
						|
									my $instext ='';
							 | 
						|
									foreach $exhline (@exhlines) {
							 | 
						|
										$instext = join('',$instext ,$exhline);
							 | 
						|
									}
							 | 
						|
									$instext =~ s/(.*)\<body(.*)\>(.*)\<\/body(.*)/$3/ig;
							 | 
						|
									return $instext;
							 | 
						|
								}
							 | 
						|
								## ^ sac relocated and renamed general support functions
							 | 
						|
								
							 | 
						|
								sub make_tree {
							 | 
						|
									my ($dirtree) = @_;
							 | 
						|
									my $dirbase=$docroot;
							 | 
						|
									my $dirbranch = $dirtree;
							 | 
						|
									my $dirbranch = s/^$docroot//g;
							 | 
						|
									my @branches=split($pathsep,$dirbranch);
							 | 
						|
								&dbgprint("make_tree:$dirbase:$dirtree:$dirbranch:$#branches\n");
							 | 
						|
									for $i (0 .. $#branches) {
							 | 
						|
										$dirbranch=join($pathsep,$dirbase,$branches[$i]);
							 | 
						|
										if (opendir(TMPDIR,"$dirbranch")) {
							 | 
						|
											closedir TMPDIR;
							 | 
						|
										} else {
							 | 
						|
											mkdir $dirbranch,0666;
							 | 
						|
								&dbgprint("mkdirResult:$dirbranch:$!\n");
							 | 
						|
										}
							 | 
						|
										$dirbase=$dirbranch;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_last_cnd_action {		#Basically, this just gets the timestamp
							 | 
						|
													#of the last action a candidate does by 
							 | 
						|
													#looking at his logfile.
							 | 
						|
													#Example: &get_last_cnd_action($account_name, $candidate_name);
							 | 
						|
								        my $acct_nombre = $_[0];        #Get client's account name
							 | 
						|
								                                        #into something more permanent
							 | 
						|
								
							 | 
						|
								        my $cnd_nombre = $_[1];         #Get the candidate name to check
							 | 
						|
								                                        #last login date.
							 | 
						|
								        my $cnd_logfile = "../secure_html/log/$acct_nombre.$cnd_nombre"; #logfile relative to cgi-bin
							 | 
						|
								        my @fileinfo = stat($cnd_logfile);      #Holds the file info.
							 | 
						|
								        my $file_mtime = $fileinfo[9];         #mtime value of the log file
							 | 
						|
								        return $file_mtime;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								sub compare_time {              #Compares a logfile's timestamp to time()
							 | 
						|
								                                #Takes values: client ID, file_mtime (returned
							 | 
						|
								                                #from &get_last_cnd_action), and time_delimiter
							 | 
						|
								                                #(Number of days to check against, like 30, 60,
							 | 
						|
								                                #etc). This should be passed in the POST/GET.
							 | 
						|
								                                #   Example: &compare_time(clid, file_mtime,
							 | 
						|
								                                #   time_delimiter);
							 | 
						|
								                                #Returns client_id if it passes, else nothing.
							 | 
						|
								        my $client_id = $_[0];  #get client ID
							 | 
						|
								        my $file_time = $_[1];  #get mtime
							 | 
						|
								        my $time_delimiter = $_[2]; #get delimiter (no. of days)
							 | 
						|
								
							 | 
						|
								        $file_time = int(((($file_time/60)/60)/24)); #change it into days
							 | 
						|
								        my $localtime = time;  #First step is to get the current time in days
							 | 
						|
								        $localtime = int(((($localtime/60)/60)/24)); #change it into days
							 | 
						|
								
							 | 
						|
								        my $difference = $localtime - $file_time; #find their difference
							 | 
						|
								
							 | 
						|
								        #Do the simple checking...
							 | 
						|
								        return $client_id unless ($difference > $time_delimiter);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								my %get_a_key_data = () ;
							 | 
						|
								
							 | 
						|
								sub get_a_key {
							 | 
						|
								  #gets a hash:key value from a file
							 | 
						|
								  #like cnd.clientid or something
							 | 
						|
								  #Example: &get_a_key(filename, cndID, hash_key);
							 | 
						|
								  #takes filename(the file that holds the
							 | 
						|
								  #stuff to parse), cndid (candidate
							 | 
						|
								  #name/id), and hash_key(basically, the
							 | 
						|
								  #field at the top of the file seperated
							 | 
						|
								  #by &). Returns the value of hash_key
							 | 
						|
								  my $match = $_[1];
							 | 
						|
								  my $magic_key = $_[2];
							 | 
						|
								  my $key_file = $_[0] ;
							 | 
						|
								  unless ($get_a_key_data{$key_file}) {
							 | 
						|
								    my @searching = &get_data($key_file);
							 | 
						|
								    my $getlegend  = shift(@searching);
							 | 
						|
								    chomp($getlegend);
							 | 
						|
								    my @labels = split( '&', $getlegend);
							 | 
						|
								    my @fields = ();
							 | 
						|
								    my %megahash =();
							 | 
						|
								    foreach (@searching) {
							 | 
						|
								      chomp $_;
							 | 
						|
								      @fields = split( '&', $_);
							 | 
						|
								      my $hashlength = $#fields;
							 | 
						|
								      my $betty;
							 | 
						|
								      foreach $betty (0..$hashlength) {
							 | 
						|
								        $get_a_key_data{$key_file}->{$fields[0]}->{$labels[$betty]} = $fields[$betty] ;
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								  return $get_a_key_data{$key_file}->{$match}->{$magic_key} ;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub print_clcnd_input {
							 | 
						|
									my ($clid, $clcndid, $flag, $print) = @_;
							 | 
						|
									$cnd = 'cnd'.$clcndid;
							 | 
						|
									$clcnd = 'clcnd'.$clcndid;
							 | 
						|
									$clcndvals = 'clcnd'.$clcndid."vals";
							 | 
						|
									$clcndformat = 'clcnd'.$clcndid."format";
							 | 
						|
									if ($flag eq "f") { 
							 | 
						|
										$flag = " onChange='set_change_flag()'";
							 | 
						|
									} else {
							 | 
						|
										$flag = "";
							 | 
						|
									}
							 | 
						|
									$output = "<TR>\n";
							 | 
						|
									if ($CLIENT{$clcndvals} ne "") {
							 | 
						|
								
							 | 
						|
										my @vals = split(/\,/, $CLIENT{$clcndvals});
							 | 
						|
										if ($CLIENT{$clcndformat} eq "radio") {
							 | 
						|
											### Print radio buttons based on clcnd values
							 | 
						|
								        		$output .= "\t<TD COLSPAN=2 ALIGN=\"left\" VALIGN=\"middle\" NOWRAP>\n";
							 | 
						|
								                	$output .= "\t\t<FONT SIZE=2>\n";
							 | 
						|
								                	$output .= "\t\t\t$CLIENT{$clcnd}\n";
							 | 
						|
								                	$output .= "\t\t</FONT>\n";
							 | 
						|
								        		$output .= "\t</TD>\n";
							 | 
						|
											$output .= "</TR>\n";
							 | 
						|
											$output .= "<TR>\n";
							 | 
						|
								        		$output .= "\t<TD ALIGN=\"right\" VALIGN=\"middle\" NOWRAP>\n";
							 | 
						|
											$output .= "\t\t \n";
							 | 
						|
								        		$output .= "\t</TD>\n";
							 | 
						|
								        		$output .= "\t<TD ALIGN=\"left\" VALIGN=\"middle\" NOWRAP>\n";
							 | 
						|
								                	$output .= "\t\t<FONT SIZE=2>\n";
							 | 
						|
											foreach $val (@vals) {
							 | 
						|
												if ($val eq $CANDIDATE{$cnd}) {
							 | 
						|
													$output .= "\t\t\t<INPUT TYPE=\"RADIO\" NAME=\"$cnd\" VALUE=\"$val\" CHECKED$flag> $val<BR>\n";
							 | 
						|
												} else {
							 | 
						|
													$output .= "\t\t\t<INPUT TYPE=\"RADIO\" NAME=\"$cnd\" VALUE=\"$val\"$flag> $val<BR>\n";
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
								                	$output .= "\t\t</FONT>\n";
							 | 
						|
								        		$output .= "\t</TD>\n";
							 | 
						|
										} else {
							 | 
						|
											### Print select box based on clcnd values
							 | 
						|
								        		$output .= "\t<TD ALIGN=\"right\" VALIGN=\"middle\" NOWRAP>\n";
							 | 
						|
								                	$output .= "\t\t<FONT SIZE=2>\n";
							 | 
						|
								                	$output .= "\t\t\t$CLIENT{$clcnd} \n";
							 | 
						|
								                	$output .= "\t\t</FONT>\n";
							 | 
						|
								        		$output .= "\t</TD>\n";
							 | 
						|
								        		$output .= "\t<TD ALIGN=\"left\" VALIGN=\"middle\" NOWRAP>\n";
							 | 
						|
								                	$output .= "\t\t<FONT SIZE=2>\n";
							 | 
						|
											unshift(@vals, "");
							 | 
						|
											$output .= "\t\t\t<SELECT NAME=\"$cnd\"$flag>\n";
							 | 
						|
											foreach $val (@vals) {
							 | 
						|
												if ($val eq $CANDIDATE{$cnd}) {
							 | 
						|
													$output .= "\t\t\t\t<OPTION value=\"$val\" SELECTED>$val</OPTION>\n";
							 | 
						|
												} else {
							 | 
						|
													$output .= "\t\t\t\t<OPTION value=\"$val\">$val</OPTION>\n";
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
											$output .= "\t\t\t</SELECT>\n";
							 | 
						|
								                	$output .= "\t\t</FONT>\n";
							 | 
						|
								        		$output .= "\t</TD>\n";
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										### Print regular input box 
							 | 
						|
										$output .= "\t<TD ALIGN=\"right\" VALIGN=\"middle\" NOWRAP>\n";
							 | 
						|
										$output .= "\t\t<FONT SIZE=2>\n";
							 | 
						|
										$output .= "\t\t\t$CLIENT{$clcnd} \n";
							 | 
						|
										$output .= "\t\t</FONT>\n";
							 | 
						|
										$output .= "\t</TD>\n";
							 | 
						|
										$output .= "\t<TD ALIGN=\"left\" VALIGN=\"middle\" NOWRAP>\n";
							 | 
						|
										$output .= "\t\t<FONT SIZE=2>\n";
							 | 
						|
										$output .= "<INPUT TYPE=TEXT NAME=\"$cnd\" SIZE=30 MAXLENGTH=30 VALUE=\"$CANDIDATE{$cnd}\"$flag>\n";
							 | 
						|
										$output .= "\t\t</FONT>\n";
							 | 
						|
										$output .= "\t</TD>\n";
							 | 
						|
									}
							 | 
						|
									$output .= "</TR>\n";
							 | 
						|
									if ($print) {
							 | 
						|
										print $output;
							 | 
						|
									} else {
							 | 
						|
										return $output;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								sub makecndhash {		#makes an md5hash out of some info. Takes 2 
							 | 
						|
												#arguments, each part of the source to generate 				#the hash. Returns the hash value.
							 | 
						|
								
							 | 
						|
												#Example: &makecndhash('paul', '67847');
							 | 
						|
									use Digest::MD5;
							 | 
						|
								
							 | 
						|
									my $length = 16;
							 | 
						|
									my $tempstring = 'j0Hx4b2uXx8';
							 | 
						|
								
							 | 
						|
									my $data = "$_[0]:$tempstring:$_[1]";
							 | 
						|
									my $ctx = Digest::MD5->new;
							 | 
						|
									$ctx->add($data);
							 | 
						|
									my $digest = $ctx->hexdigest;
							 | 
						|
									my $fragment = substr $digest, 0, $length;
							 | 
						|
									$fragment =~ s/..../$&-/g;
							 | 
						|
									$fragment =~ s/-$//g;
							 | 
						|
									return $fragment;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub popEmlAcl {
							 | 
						|
									my $clid = $_[0];
							 | 
						|
									my $tempstring;
							 | 
						|
									my @searching = get_data("$clid.emlacl");
							 | 
						|
									foreach (@searching) {
							 | 
						|
										chomp($_);
							 | 
						|
										$tempstring .= $_ . "," unless /^(#|\n|\s|$)/;#gets out comments and blank lines
							 | 
						|
									}
							 | 
						|
									$tempstring =~ s/\,$//g;
							 | 
						|
									my @returnarray = split(/\,/, $tempstring);
							 | 
						|
								
							 | 
						|
									return @returnarray;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub pushEmlAcl {
							 | 
						|
									my $clid = $_[0];
							 | 
						|
									my $recstr = $_[1];
							 | 
						|
									my $tempstring;
							 | 
						|
									my @searching = get_data("$clid.emlacl");
							 | 
						|
									foreach (@searching) {	#First we keep comments 
							 | 
						|
										chomp($_);
							 | 
						|
										if (/^(#|$)/) {
							 | 
						|
											$tempstring .= "$_,";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$tempstring .= $recstr;
							 | 
						|
									my @pusharray = split(/\,/, $tempstring);
							 | 
						|
								
							 | 
						|
									$trash = join( $pathsep, $dataroot, "$clid.emlacl");
							 | 
						|
									open( EMLACLFILE, ">$trash" ) or die "$trash not found! $!";
							 | 
						|
								
							 | 
						|
									foreach (@pusharray) {
							 | 
						|
										print EMLACLFILE "$_\n";
							 | 
						|
									}
							 | 
						|
									close EMLACLFILE;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub get_data_hash {
							 | 
						|
								# Read a data file, and return a hash of the file.
							 | 
						|
								# Parameters are the file name, and a flag for using a lock file.
							 | 
						|
								# Return an unnamed hash of hashes.
							 | 
						|
								# The keys of the first hash are the ids.
							 | 
						|
								# The values of the first hash is a hash with one line's data.
							 | 
						|
								#    This next hash has the field ids for keys.
							 | 
						|
									my ($file, $lock) = @_;
							 | 
						|
									my @data_lines = get_data($file, $lock) ;
							 | 
						|
									my $bFirst = 1 ;
							 | 
						|
									my %DATA = () ;
							 | 
						|
									my %FIELDS = () ;
							 | 
						|
									my %ROWS = () ;
							 | 
						|
								  foreach $datadef (@data_lines) {
							 | 
						|
								    chop ($datadef);
							 | 
						|
								    if ($bFirst eq 1) {
							 | 
						|
											# First line only.
							 | 
						|
								      @flds = split(/&/, $datadef);
							 | 
						|
											# Validate field ids, no duplicates.
							 | 
						|
											foreach $fld (@flds) {
							 | 
						|
												if ($FIELDS{$fld}) {
							 | 
						|
													warn "Duplicate field id, $fld, in file $file ." ;
							 | 
						|
												} else {
							 | 
						|
													$FIELDS{$fld} = 1 ;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
								      $bFirst = 0;
							 | 
						|
								    } else {
							 | 
						|
											# Second and later lines.
							 | 
						|
								      my ($id) = split(/&/, $datadef);
							 | 
						|
											if ($ROWS{$id}) {
							 | 
						|
								   			warn "Duplicate row id value $id, in file $file ." ;
							 | 
						|
											} else {
							 | 
						|
												$ROWS{$id} = 1 ;
							 | 
						|
											}
							 | 
						|
											# warn "ID $id DATALINE $datadef X\n" ;
							 | 
						|
								      @rowdata = split(/&/, $datadef);
							 | 
						|
											if ($#rowdata > $#flds) {
							 | 
						|
												warn "More data fields than field ids, in file $file ." ;
							 | 
						|
											}
							 | 
						|
								      $counter = 0;
							 | 
						|
								      foreach $fld (@flds) {
							 | 
						|
												$DATA{$id}->{$fld} = $rowdata[$counter] ;
							 | 
						|
												$counter ++ ;
							 | 
						|
								      }
							 | 
						|
										} # End of if $bFirst.
							 | 
						|
									} # foreach
							 | 
						|
									return \%DATA ;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# end with True because this is a require file
							 | 
						|
								1
							 | 
						|
								
							 | 
						|
								
							 |