From c69050cc180726a9b6d10084c9135f6bc0f836a3 Mon Sep 17 00:00:00 2001 From: TechEmporium Date: Sat, 12 Jan 2019 14:36:51 -0500 Subject: [PATCH] First site 2.0 copy --- abuse.admin.php | 860 +++++++ abuse.lib.php | 3390 ++++++++++++++++++++++++++++ abuse.php | 94 + abuse.phpmailer.php | 5258 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 9602 insertions(+) create mode 100644 abuse.admin.php create mode 100644 abuse.lib.php create mode 100644 abuse.php create mode 100644 abuse.phpmailer.php diff --git a/abuse.admin.php b/abuse.admin.php new file mode 100644 index 0000000..e5e89c5 --- /dev/null +++ b/abuse.admin.php @@ -0,0 +1,860 @@ + + $isHideForm, + 'error_fields' => isset($phpfmg_send['error']) ? $phpfmg_send['error']['fields'] : '', + 'OneEntry' => isset($GLOBALS['OneEntry']) ? $GLOBALS['OneEntry'] : '', + ); + + @header("Content-Type:text/html; charset=$charset"); + echo ""; + +} + + +function phpfmg_admin_default(){ + if( phpfmg_user_login() ){ + phpfmg_admin_panel(); + }; +} + + + +function phpfmg_admin_panel() +{ + if( !phpfmg_user_isLogin() ){ + exit; + }; + + phpfmg_admin_header(); + phpfmg_writable_check(); +?> + + + + +
+ + + + + + +
+ 1. Email Traffics +
+
+ view    + download    + delete all'; + }; + ?> +
+ + +
+ 2. Form Data +
+
+ view    + download    + delete all'; + }; + ?> +
+ +
+ 3. Form Generator +
+
+ Edit Form    + New Form +
+
+ + "> +
+ +
+ + + + + <?php echo '' == $title ? '' : $title . ' | ' ; ?>PHP FormMail Admin Panel + + + + + + + + + + + +
+ Form Admin Panel + +   +Main Menu   ' ; + echo 'Logout' ; + }; +?> +
+ +
+ + + +
+ +
+ :: PHP FormMail Generator :: +
+ + + +out_processing_gif(); +} + + +# phpfmg module : captcha +# ------------------------------------------------------ +function phpfmg_captcha_get(){ + $img = new phpfmgImage(); + $img->out(); + //$_SESSION[PHPFMG_ID.'fmgCaptchCode'] = $img->text ; + $_SESSION[ phpfmg_captcha_name() ] = $img->text ; +} + + + +function phpfmg_captcha_generate_images(){ + for( $i = 0; $i < 50; $i ++ ){ + $file = "$i.png"; + $img = new phpfmgImage(); + $img->out($file); + $data = base64_encode( file_get_contents($file) ); + echo "'{$img->text}' => '{$data}',\n" ; + unlink( $file ); + }; +} + + +function phpfmg_dd_lookup(){ + $paraOk = ( isset($_REQUEST['n']) && isset($_REQUEST['lookup']) && isset($_REQUEST['field_name']) ); + if( !$paraOk ) + return; + + $base64 = phpfmg_dependent_dropdown_data(); + $data = @unserialize( base64_decode($base64) ); + if( !is_array($data) ){ + return ; + }; + + + foreach( $data as $field ){ + if( $field['name'] == $_REQUEST['field_name'] ){ + $nColumn = intval($_REQUEST['n']); + $lookup = $_REQUEST['lookup']; // $lookup is an array + $dd = new DependantDropdown(); + echo $dd->lookupFieldColumn( $field, $nColumn, $lookup ); + return; + }; + }; + + return; +} + + +function phpfmg_filman_download(){ + if( !isset($_REQUEST['filelink']) ) + return ; + + $filelink = base64_decode($_REQUEST['filelink']); + $file = PHPFMG_SAVE_ATTACHMENTS_DIR . basename($filelink); + + // 2016-12-05: to prevent *LFD/LFI* attack. patch provided by Pouya Darabi, a security researcher in cert.org + $real_basePath = realpath(PHPFMG_SAVE_ATTACHMENTS_DIR); + $real_requestPath = realpath($file); + if ($real_requestPath === false || strpos($real_requestPath, $real_basePath) !== 0) { + return; + }; + + if( !file_exists($file) ){ + return ; + }; + + phpfmg_util_download( $file, $filelink ); +} + + +class phpfmgDataManager +{ + var $dataFile = ''; + var $columns = ''; + var $records = ''; + + function __construct(){ + $this->dataFile = PHPFMG_SAVE_FILE; + } + + function phpfmgDataManager(){ + $this->dataFile = PHPFMG_SAVE_FILE; + } + + function parseFile(){ + $fp = @fopen($this->dataFile, 'rb'); + if( !$fp ) return false; + + $i = 0 ; + $phpExitLine = 1; // first line is php code + $colsLine = 2 ; // second line is column headers + $this->columns = array(); + $this->records = array(); + $sep = chr(0x09); + while( !feof($fp) ) { + $line = fgets($fp); + $line = trim($line); + if( empty($line) ) continue; + $line = $this->line2display($line); + $i ++ ; + switch( $i ){ + case $phpExitLine: + continue; + break; + case $colsLine : + $this->columns = explode($sep,$line); + break; + default: + $this->records[] = explode( $sep, phpfmg_data2record( $line, false ) ); + }; + }; + fclose ($fp); + } + + function displayRecords(){ + $this->parseFile(); + echo ""; + echo "\n"; + $i = 1; + foreach( $this->records as $r ){ + echo "\n"; + $i++; + }; + echo "
 " . join( " ", $this->columns ) . "
{$i} " . join( " ", $r ) . "
\n"; + } + + function line2display( $line ){ + $line = str_replace( array('"' . chr(0x09) . '"', '""'), array(chr(0x09),'"'), $line ); + $line = substr( $line, 1, -1 ); // chop first " and last " + return $line; + } + +} +# end of class + + + +# ------------------------------------------------------ +class phpfmgImage +{ + var $im = null; + var $width = 73 ; + var $height = 33 ; + var $text = '' ; + var $line_distance = 8; + var $text_len = 4 ; + + function __construct( $text = '', $len = 4 ){ + $this->phpfmgImage( $text, $len ); + } + + function phpfmgImage( $text = '', $len = 4 ){ + $this->text_len = $len ; + $this->text = '' == $text ? $this->uniqid( $this->text_len ) : $text ; + $this->text = strtoupper( substr( $this->text, 0, $this->text_len ) ); + } + + function create(){ + $this->im = imagecreate( $this->width, $this->height ); + $bgcolor = imagecolorallocate($this->im, 255, 255, 255); + $textcolor = imagecolorallocate($this->im, 0, 0, 0); + $this->drawLines(); + imagestring($this->im, 5, 20, 9, $this->text, $textcolor); + } + + function drawLines(){ + $linecolor = imagecolorallocate($this->im, 210, 210, 210); + + //vertical lines + for($x = 0; $x < $this->width; $x += $this->line_distance) { + imageline($this->im, $x, 0, $x, $this->height, $linecolor); + }; + + //horizontal lines + for($y = 0; $y < $this->height; $y += $this->line_distance) { + imageline($this->im, 0, $y, $this->width, $y, $linecolor); + }; + } + + function out( $filename = '' ){ + if( function_exists('imageline') ){ + $this->create(); + if( '' == $filename ) header("Content-type: image/png"); + ( '' == $filename ) ? imagepng( $this->im ) : imagepng( $this->im, $filename ); + imagedestroy( $this->im ); + }else{ + $this->out_predefined_image(); + }; + } + + function uniqid( $len = 0 ){ + $md5 = md5( uniqid(rand()) ); + return $len > 0 ? substr($md5,0,$len) : $md5 ; + } + + function out_predefined_image(){ + header("Content-type: image/png"); + $data = $this->getImage(); + echo base64_decode($data); + } + + // Use predefined captcha random images if web server doens't have GD graphics library installed + function getImage(){ + $images = array( + 'F152' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QkMZAlhDHaY6IIkFNDAGsDYwBASgiLECxRgdRFDEgHqnMjSIILkvNGpV1NLMrFVRSO4DqQOSjQ5oeoFkKwO6eQ0BU9DFGB0dAlDFWEMZQhlDQwZB+FERYnEfAAa9y0AwZOMeAAAAAElFTkSuQmCC', + 'E0D3' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAWElEQVR4nGNYhQEaGAYTpIn7QkMYAlhDGUIdkMQCGhhDWBsdHQJQxFhbWYGkCIqYSKMrkAxAcl9o1LSVqauilmYhuQ9NHYqYCEE7MN2Czc0DFX5UhFjcBwAy2c6h5bRojwAAAABJRU5ErkJggg==', + 'DA83' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7QgMYAhhCGUIdkMQCpjCGMDo6OgQgi7WytrI2BDSIoIiJNAKVNQQguS9q6bSVWaGrlmYhuQ9NHVRMNNQVi3kYYlNAelHdEhog0uiA5uaBCj8qQizuAwBqnM8Xn/TN4wAAAABJRU5ErkJggg==', + 'F9B7' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaElEQVR4nGNYhQEaGAYTpIn7QkMZQ1hDGUNDkMQCGlhbWRsdGkRQxEQaXUEkuhhQXQCS+0Kjli5NDV21MgvJfQENjIFAda0MKHoZQOZNQRVjAYkFMGC4xdEBVQzsZhSxgQo/KkIs7gMAAKfOPXKC2kUAAAAASUVORK5CYII=', + 'A527' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdklEQVR4nM2QsQ2AQAhFobgNcB/cAJOjcQSnwIINzhEsdEqv84iWGuUnFK+Alw/7ZQz+lFf8kDsFRc0NS0KGPRs1jApZMglMnHLdNaffuC7rvk3b1PiJw8wO3v5VraxAgXhvZgGJLDkycmSYkw6BfdXfg7nxOwDfRcvyKTTVMwAAAABJRU5ErkJggg==', + '5FA3' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaElEQVR4nGNYhQEaGAYTpIn7QkNEQx2mMIQ6IIkFNIg0MIQyOgSgiTE6OoBk4DAwQKSBFSgTgOS+sGlTw5auilqahey+VhR1CLHQABTzAqDqkMVEpoDEAlHcwgqxF8XNAxV+VIRY3AcAHwPN0GMD2nwAAAAASUVORK5CYII=', + '243D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7WAMYWhlDGUMdkMREpjBMZW10dAhAEgtoZQhlaAh0EEHW3croygBUJ4LsvmlLl66aujJrGrL7AkRakdSBIaODKNBOVPNYgSai2wFkt6K7JTQU080DFX5UhFjcBwC4z8sQZNDF3QAAAABJRU5ErkJggg==', + 'EF3D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAWUlEQVR4nGNYhQEaGAYTpIn7QkNEQx1DGUMdkMQCGkQaWBsdHQLQxBgaAh1E0MWA6kSQ3BcaNTVs1dSVWdOQ3IemDr95WMTQ3RIaItLAiObmgQo/KkIs7gMAgHLNOkpES64AAAAASUVORK5CYII=', + '48F2' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpI37pjCGsIYGTHVAFgthbWVtYAgIQBJjDBFpdG1gdBBBEmOdAlbXIILkvmnTVoYtDV21KgrJfQEQdY3IdoSGgsxjaEV1C1hsCqoYxC0Ybm5gDA0ZDOFHPYjFfQBilMuTRyxtdgAAAABJRU5ErkJggg==', + '5CAF' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpIn7QkMYQxmmMIaGIIkFNLA2OoQyOjCgiIk0ODo6oogFBog0sDYEwsTATgqbNm3V0lWRoVnI7mtFUYcQC0UVCwCKuaKpE5nC2oguxhrAGIph3gCFHxUhFvcBAP3RyzAmLqHvAAAAAElFTkSuQmCC', + '19B0' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7GB0YQ1hDGVqRxVgdWFtZGx2mOiCJiTqINLo2BAQEoOgFijU6OogguW9l1tKlqaErs6YhuQ9oRyCSOqgYA9C8QDQxFix2YHFLCKabByr8qAixuA8AyM3KUvjtMMoAAAAASUVORK5CYII=', + '2105' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nM2QsRHAIAwDReENGAiK9ErhIkxDwwYkG6RhykDnHCmTu1idTrL/jDZNxp/0CZ8QRHVK4/nqCHXB5liELsabhwJKXpdg+Y6WzralZPk4cszedPv2yZOeHDes50dbQcunKoqKPfzgfy/qge8CQVvIaymcbJsAAAAASUVORK5CYII=', + '0F97' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7GB1EQx1CGUNDkMRYA0QaGB0dGkSQxESmiDSwNgSgiAW0QsQCkNwXtXRq2MrMqJVZSO4DqWMICWhlQNMLJKcwoNnB2BAQwIDhFkcHVDcD9YYyoogNVPhREWJxHwAt+8sjvlP2ygAAAABJRU5ErkJggg==', + '77F7' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYklEQVR4nGNYhQEaGAYTpIn7QkNFQ11DA0NDkEVbGRpdgbQIIbEpDK2sQDoA2X1Rq6YtDV21MgvJfYwODAGsIBOQ9LICRVlBJiCJiQBFgWIByGIBYFGgCQTEBir8qAixuA8A5/nK1kyB4VAAAAAASUVORK5CYII=', + '2160' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcElEQVR4nGNYhQEaGAYTpIn7WAMYAhhCGVqRxUSmMAYwOjpMdUASC2hlDWBtcAgIQNbdygAUY3QQQXbftFVRS6euzJqG7D6gHayOjjB1YMjoANIbiCLG2gASC0CxAyiP4ZbQUNZQdDcPVPhREWJxHwBFackYlJahVAAAAABJRU5ErkJggg==', + '6978' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdUlEQVR4nGNYhQEaGAYTpIn7WAMYQ1hDA6Y6IImJTGFtZWgICAhAEgtoEWl0aAh0EEEWawCKNTrA1IGdFBm1dGnW0lVTs5DcFzKFMdBhCgOqea0MQJ2MqOa1sjQ6OqCKgdzC2oCqF+zmBgYUNw9U+FERYnEfAJtEzRM1OoL1AAAAAElFTkSuQmCC', + 'CE84' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYUlEQVR4nGNYhQEaGAYTpIn7WENEQxlCGRoCkMREWkUaGB0dGpHFAhpFGlgbAlpRxBrA6qYEILkvatXUsFWhq6KikNwHUefogK6XtSEwNATTDmxuQRHD5uaBCj8qQizuAwDuiM2jcyLlCAAAAABJRU5ErkJggg==', + '00F1' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXklEQVR4nGNYhQEaGAYTpIn7GB0YAlhDA1qRxVgDGENYGximIouJTGFtBYqFIosFtIo0ujYwwPSCnRS1dNrK1NBVS5Hdh6YOpxjUDmxuQREDuxnoloBBEH5UhFjcBwAh48qTb0HaGAAAAABJRU5ErkJggg==', + '684F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7WAMYQxgaHUNDkMREprC2MrQ6OiCrC2gRaXSYiibWAFQXCBcDOykyamXYyszM0Cwk94UAzWNtRNPbKtLoGhqIIeaApg7sFjQxqJtRxAYq/KgIsbgPANY4ywmw5yzvAAAAAElFTkSuQmCC', + '39CF' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYUlEQVR4nGNYhQEaGAYTpIn7RAMYQxhCHUNDkMQCprC2MjoEOqCobBVpdG0QRBWbAhJjhImBnbQyaunS1FUrQ7OQ3TeFMRBJHdQ8hkZMMRYMO7C5BepmVL0DFH5UhFjcBwAZu8mPc4I00gAAAABJRU5ErkJggg==', + 'E7A3' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QkNEQx2mMIQ6IIkFNDA0OoQyOgSgiTk6OjSIoIq1sgLJACT3hUatmrZ0VdTSLCT3AeUDkNRBxRgdWEMD0MxjbQCpQxUTAYoForglNAQkFoDi5oEKPypCLO4DAE94zskcm8o0AAAAAElFTkSuQmCC', + '07B8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcElEQVR4nGNYhQEaGAYTpIn7GB1EQ11DGaY6IImxBjA0ujY6BAQgiYlMAYo1BDqIIIkFtDK0siLUgZ0UtXTVtKWhq6ZmIbkPqC6AFc28gFZGB1Y080SmsDagi7EGiDSg62UEqmBFc/NAhR8VIRb3AQDGIcyLWw1K1AAAAABJRU5ErkJggg==', + '719B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QkMZAhhCGUMdkEVbGQMYHR0dAlDEWANYGwIdRJDFpjCAxQKQ3Re1KmplZmRoFpL7GB2AdoQEopjH2gAUQzMPyA5gRBMLAImhuSWggTUUw80DFH5UhFjcBwCmSsirRUkFjQAAAABJRU5ErkJggg==', + '691C' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7WAMYQximMEwNQBITmcLayhDCECCCJBbQItLoGMLowIIs1iDS6DCF0QHZfZFRS5dmTVuZhey+kCmMgUjqIHpbGRoxxVjAYsh2gN0yBdUtIDczhjqguHmgwo+KEIv7APkGy0sLSVsmAAAAAElFTkSuQmCC', + 'B561' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QgNEQxlCGVqRxQKmiDQwOjpMRRFrFWlgbXAIRVMXwtoA1wt2UmjU1KVLp65aiuy+gCkMja6ODqh2tALFQCSqHZhiU1hbGdH0hgYwhgDdHBowCMKPihCL+wAEBs3FJNZm/wAAAABJRU5ErkJggg==', + 'EFEB' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAATUlEQVR4nGNYhQEaGAYTpIn7QkNEQ11DHUMdkMQCGkQaWBsYHQKwiIngVgd2UmjU1LCloStDs5DcR6p5eOyAuhkohubmgQo/KkIs7gMAzNXL2UVo758AAAAASUVORK5CYII=', + '2BC3' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaElEQVR4nGNYhQEaGAYTpIn7WANEQxhCHUIdkMREpoi0MjoEOgQgiQW0ijS6Ngg0iCDrbhVpZQXJIbtv2tSwpatWLc1Cdl8AijowZHQAmceAYh5rA6YdIg2YbgkNxXTzQIUfFSEW9wEAnUDMi4E+pBwAAAAASUVORK5CYII=', + '3209' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdklEQVR4nGNYhQEaGAYTpIn7RAMYQximMEx1QBILmMLayhDKEBCArLJVpNHR0dFBBFlsCkOja0MgTAzspJVRq5YuXRUVFYbsvikMU1gbAqai6G1lCACKNaCKMTowOjqg2AF0SwO6W0QDREMd0Nw8UOFHRYjFfQBU/8uCqGVKHAAAAABJRU5ErkJggg==', + '9F5E' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7WANEQ11DHUMDkMREpog0sDYwOiCrC2jFITYVLgZ20rSpU8OWZmaGZiG5j9VVBEgGouhlaMUUEwDbgSoGcgujoyOKGGsAUG8oI4qbByr8qAixuA8A/WjJho2W8hAAAAAASUVORK5CYII=', + '766B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QkMZQxhCGUMdkEVbWVsZHR0dAlDERBpZGxwdRJDFpog0sDYwwtRB3BQ1LWzp1JWhWUjuY3QQbWVFM4+1QaTRtSEQxTwRLGIBDZhuCWjA4uYBCj8qQizuAwBOc8rh+GXEWAAAAABJRU5ErkJggg==', + 'DBB1' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAV0lEQVR4nGNYhQEaGAYTpIn7QgNEQ1hDGVqRxQKmiLSyNjpMRRFrFWl0bQgIRRMDqYPpBTspaunUsKWhq5Yiuw9NHbJ5hMWmYOqFujk0YBCEHxUhFvcBAK32zxANYpv3AAAAAElFTkSuQmCC', + '271F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7WANEQx2mMIaGIImJTGFodAhhdEBWF9DK0OiIJsbQCoRT4GIQN00DwZWhWcjuCwDCKah6GR2AfDQxViBEFxMBQnSx0FCRBsZQR1S3DFD4URFicR8AxEDIdp5oglcAAAAASUVORK5CYII=', + '9F9F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7WANEQx1CGUNDkMREpog0MDo6OiCrC2gVaWBtCMQnBnbStKlTw1ZmRoZmIbmP1VWkgSEEVS8DUC8DmnkCQDFGNDFsbmENAOoNZUQ1b4DCj4oQi/sAsh/JLHYl18IAAAAASUVORK5CYII=', + 'DEDD' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAUUlEQVR4nGNYhQEaGAYTpIn7QgNEQ1lDGUMdkMQCpog0sDY6OgQgi7UCxRoCHURwi4GdFLV0atjSVZFZ05DcR4Re3GJY3ILNzQMVflSEWNwHAKFizVh9TwSKAAAAAElFTkSuQmCC', + '9F74' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7WANEQ11DAxoCkMREpogAyYBGZLGAVrBYK4ZYo8OUACT3TZs6NWzV0lVRUUjuY3UFqpvC6ICslwGkN4AxNARJTAAoxujAgOEW1gZUMdYATLGBCj8qQizuAwBiZM2fhhaKUAAAAABJRU5ErkJggg==', + '9317' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7WANYQximMIaGIImJTBFpZQgB0khiAa0MjY6YYq0MU4A0kvumTV0VtmraqpVZSO5jdQWra0WxGWiewxSQbgQUgIgFMKC7ZQqjA7qbGUMdUcQGKvyoCLG4DwDlGMrwZVHhOwAAAABJRU5ErkJggg==', + '1917' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcElEQVR4nGNYhQEaGAYTpIn7GB0YQximMIaGIImxOrC2MoQwNIggiYk6iDQ6ookxAsUcpjA0BCC5b2XW0qVZ04AUkvuAdgQC1bWi2ssA0jsFVYwFJBaAKgZ0yxSgamS3hDCGMIY6oogNVPhREWJxHwD7/siyYXw2RAAAAABJRU5ErkJggg==', + 'DED8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAVklEQVR4nGNYhQEaGAYTpIn7QgNEQ1lDGaY6IIkFTBFpYG10CAhAFmsFijUEOohgiAXA1IGdFLV0atjSVVFTs5Dch6aOgHloYljcgs3NAxV+VIRY3AcAIfXOioZ7rn0AAAAASUVORK5CYII=', + '177F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZElEQVR4nGNYhQEaGAYTpIn7GB1EQ11DA0NDkMRYHRgaHRoCHZDViWIRY3RgaGVodISJgZ20MmvVtFVLV4ZmIbkPqC6AYQojml6QKLoYK0QcRUykASSK4pYQTLGBCj8qQizuAwDvO8a5dD0LpAAAAABJRU5ErkJggg==', + '5BC8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7QkNEQxhCHaY6IIkFNIi0MjoEBASgijW6Ngg6iCCJBQaItLI2MMDUgZ0UNm1q2NJVq6ZmIbuvFUUdTAxoHiOKeQGtmHaITMF0C2sAppsHKvyoCLG4DwARFczDMjPWawAAAABJRU5ErkJggg==', + '9803' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7WAMYQximMIQ6IImJTGFtZQhldAhAEgtoFWl0dHRoEEERY21lbQhoCEBy37SpK8OWropamoXkPlZXFHUQCDTPFSiCbJ4AFjuwuQWbmwcq/KgIsbgPAKMBzINB7vefAAAAAElFTkSuQmCC', + '6280' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdElEQVR4nGNYhQEaGAYTpIn7WAMYQxhCGVqRxUSmsLYyOjpMdUASC2gRaXRtCAgIQBZrYGh0dHR0EEFyX2TUqqWrQldmTUNyX8gUhimMCHUQva0MAawNgWhijA6saHYA3dKA7hbWANFQBzQ3D1T4URFicR8ACIvMEh8Xdc4AAAAASUVORK5CYII=', + '8FB8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAVElEQVR4nGNYhQEaGAYTpIn7WANEQ11DGaY6IImJTBFpYG10CAhAEgtoBYo1BDqI4FYHdtLSqKlhS0NXTc1Cch+x5hFhB9TNQDE0Nw9U+FERYnEfAKlyzV+mY8KbAAAAAElFTkSuQmCC', + 'A19B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaElEQVR4nGNYhQEaGAYTpIn7GB0YAhhCGUMdkMRYAxgDGB0dHQKQxESmsAawNgQ6iCCJBbQygMUCkNwXtXRV1MrMyNAsJPeB1DGEBKKYFxoKFMNiHiM2MTS3BLSyhqK7eaDCj4oQi/sAaB/JdbkYSI0AAAAASUVORK5CYII=', + '0621' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7GB0YQxhCGVqRxVgDWFsZHR2mIouJTBFpZG0ICEUWC2gVAZPI7otaOi1s1cqspcjuC2gVbWVoRbUDqLfRYQqqGMgOhwAsbnFAFQO5mTU0IDRgEIQfFSEW9wEAfkTK5QtOmK0AAAAASUVORK5CYII=', + '3536' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7RANEQxlDGaY6IIkFTBFpYG10CAhAVtkqAiQDHQSQxaaIhDA0Ojogu29l1NSlq6auTM1Cdt8UhkaHRkc084BiQPNEUO3AEAuYwtqK7hbRAMYQdDcPVPhREWJxHwCuwMypBIcJeAAAAABJRU5ErkJggg==', + '1864' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7GB0YQxhCGRoCkMRYHVhbGR0dGpHFRB1EGl0bHFoDUPSytrI2MEwJQHLfyqyVYUunroqKQnIfWJ2jowOqXpB5gaEhGGIBDeh2AN2CIiYagunmgQo/KkIs7gMAhrfK/CzBCWwAAAAASUVORK5CYII=', + '989B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7WAMYQxhCGUMdkMREprC2Mjo6OgQgiQW0ijS6NgQ6iKCIsbayAsUCkNw3berKsJWZkaFZSO5jdWVtZQgJRDGPAWieA5p5AkAxRzQxbG7B5uaBCj8qQizuAwDITssEUwJrEwAAAABJRU5ErkJggg==', + 'B6B6' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYklEQVR4nGNYhQEaGAYTpIn7QgMYQ1hDGaY6IIkFTGFtZW10CAhAFmsVaWRtCHQQQFEn0sDa6OiA7L7QqGlhS0NXpmYhuS9giijQPEcM81yB5okQEsPiFmxuHqjwoyLE4j4AOlTN7ga1Fu8AAAAASUVORK5CYII=', + '72EE' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYElEQVR4nGNYhQEaGAYTpIn7QkMZQ1hDHUMDkEVbWVtZGxgdUFS2ijS6ootNYUAWg7gpatXSpaErQ7OQ3AdUMQXdPNYGhgB0MREgH10sAKgSU0w01BXdzQMUflSEWNwHABodyPUcVJ3GAAAAAElFTkSuQmCC', + '7E97' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QkNFQxlCGUNDkEVbRRoYHR0aRNDEWBsCUMWmQMQCkN0XNTVsZWbUyiwk9zE6AHWFBLQi28sKNilgCrKYCBAyNgQEIIuBbGR0dHRAFQO7GUVsoMKPihCL+wDklssFmdWEOwAAAABJRU5ErkJggg==', + '440F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpI37pjC0MkxhDA1BFgthmMoQyuiArI4xBCji6IgixjqF0ZW1IRAmBnbStGlLly5dFRmaheS+gCkirUjqwDA0VDTUFU0M5BZ0O8DuQ3ML1M2oYgMVftSDWNwHAPTvyNZ7zm8zAAAAAElFTkSuQmCC', + '34C3' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpIn7RAMYWhlCHUIdkMQCpjBMZXQIdAhAVglUxdog0CCCLDaF0ZUVpB7JfSujli5dumrV0ixk900RaUVSBzVPNNQVSIug2tGKbgfQLa3obsHm5oEKPypCLO4DAAuZzB0lWiQvAAAAAElFTkSuQmCC', + '1238' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7GB0YQxhDGaY6IImxOrC2sjY6BAQgiYk6iDQ6NAQ6iKDoZWh0QKgDO2ll1qqlq6aumpqF5D6guikMaOYBxQIYMMwDimKIsTZguCVENNQRzc0DFX5UhFjcBwC8z8o6e7NA2QAAAABJRU5ErkJggg==', + '9F61' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7WANEQx1CGVqRxUSmiDQwOjpMRRYLaBVpYG0AqsQQg+sFO2na1KlhS6euWorsPlZXoDpHBxQ7GMB6A1DEBLCIQd2CIsYaINLAEMoQGjAIwo+KEIv7AKMhy7vZmmZiAAAAAElFTkSuQmCC', + 'D71B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QgNEQx2mMIY6IIkFTGFodAhhdAhAFmtlaHQEiomgirUyTIGrAzspaumqaaumrQzNQnIfUF0AkjqoGKMDSAzVPNYGDLEpIg3oekMDRBoYQx1R3DxQ4UdFiMV9AK1fzIIAqTpVAAAAAElFTkSuQmCC', + '8D6A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7WANEQxhCGVqRxUSmiLQyOjpMdUASC2gVaXRtcAgIQFUHFGN0EEFy39KoaStTp67MmobkPrA6R0eYOiTzAkNDMMVQ1EHcgqoX4mZGFLGBCj8qQizuAwDXU8yXXzpOTgAAAABJRU5ErkJggg==', + '8A01' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7WAMYAhimMLQii4lMYQxhCGWYiiwW0MrayujoEIqqTqTRFSiD7L6lUdNWpq6KWorsPjR1UPNEQzHFRBodHR1a0e0A2ooixhoAFJvCEBowCMKPihCL+wDO8s0Ouu10XgAAAABJRU5ErkJggg==', + 'D41E' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7QgMYWhmmMIYGIIkFTGGYyhDC6ICsLqCVIZQRQ4zRFagXJgZ2UtTSpUtXTVsZmoXkvoBWkVYkdVAx0VAHDDEGTHVTMMVAbmYMdURx80CFHxUhFvcBAEtlyshnNF60AAAAAElFTkSuQmCC', + 'B548' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7QgNEQxkaHaY6IIkFTBFpYGh1CAhAFmsFik11dBBBVRfCEAhXB3ZSaNTUpSszs6ZmIbkvYApDo2sjunlAsdBAVPNaRRodGtHtYAWqRNUbGsAYgu7mgQo/KkIs7gMApzrPAPZcqtYAAAAASUVORK5CYII=', + '82E6' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7WAMYQ1hDHaY6IImJTGFtZW1gCAhAEgtoFWl0bWB0EEBRxwAWQ3bf0qhVS5eGrkzNQnIfUN0U1gZGNPMYAoBiDiIoYowO6GJAtzSgu4U1QDTUFc3NAxV+VIRY3AcAAHrLO3bNnVcAAAAASUVORK5CYII=', + '755A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nGNYhQEaGAYTpIn7QkNFQ1lDHVpRRFtFGlgbGKY6YIoFBCCLTREJYZ3K6CCC7L6oqUuXZmZmTUNyH6MDQ6NDQyBMHRgCzQKJhYYgiYk0iDS6oqkLaGBtZXR0RBNjDGEIZUQRG6jwoyLE4j4AGL/LSQRkim4AAAAASUVORK5CYII=', + '47B7' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpI37poiGuoYyhoYgi4UwNLo2OjSIIIkxgsQaAlDEWKcwtLIC1QUguW/atFXTloauWpmF5L6AKQwBQHWtyPaGhjI6sIJkUNzC2gAUC0AVE2lgbXR0wBAD6h8U4Uc9iMV9ALB6zFXVdFMnAAAAAElFTkSuQmCC', + '50A5' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdUlEQVR4nM3QMQ6AIAyF4XboDTgQDu6PBEx09x514AbKHeSU6laioya22xcS/pTqbZT+tJ/0pUiglROMQTlSYk+NSeauayzALb2G3pu+oZR9ruM02b58vYM6+/NlqTVkyaLBW3MrR1HA9gkIp23+B/d7cR/6DrSdzBO2IUYPAAAAAElFTkSuQmCC', + '57E9' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nGNYhQEaGAYTpIn7QkNEQ11DHaY6IIkFNDA0ujYwBARgiDE6iCCJBQYwtLIixMBOCpu2atrS0FVRYcjua2UIYG1gmIqsl6GV0QEo1oAsFgA0DSiGYofIFBGQGIpbWAOAYmhuHqjwoyLE4j4AmHPLfGhT9RQAAAAASUVORK5CYII=', + '6D7B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nGNYhQEaGAYTpIn7WANEQ1hDA0MdkMREpoi0MjQEOgQgiQW0iDQ6AMVEkMUagGKNjjB1YCdFRk1bmbV0ZWgWkvtCpgDVTWFENa8VKBbAiGoeUMzRAVUM5BbWBlS9YDc3MKK4eaDCj4oQi/sAI9DMuukE9a0AAAAASUVORK5CYII=', + 'C647' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7WEMYQxgaHUNDkMREWllbGVodGkSQxAIaRRoZpqKJgXiBDkAa4b6oVdPCVmZmrcxCcl9Ag2gra6NDKwOq3kbX0IApDGh2ODQ6BDCgu6XR0QGLm1HEBir8qAixuA8AhQnNF/54iuIAAAAASUVORK5CYII=', + 'D4EC' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAY0lEQVR4nGNYhQEaGAYTpIn7QgMYWllDHaYGIIkFTGGYytrAECCCLNbKEMrawOjAgiLG6AoSQ3Zf1FIgCF2Zhey+gFaRViR1UDHRUFcMMYZWDDumgMRQ3YLNzQMVflSEWNwHAKEXy8OxdmEIAAAAAElFTkSuQmCC', + '12E9' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7GB0YQ1hDHaY6IImxOrC2sjYwBAQgiYk6iDS6AlWLoOhlQBYDO2ll1qqlS0NXRYUhuQ+obgrQvKloegOAYg2oYowOQDE0O1gbMNwSIhrqiubmgQo/KkIs7gMASZfIT2qs2jIAAAAASUVORK5CYII=', + '8C7A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7WAMYQ1lDA1qRxUSmsDY6NARMdUASC2gVaQCKBQSgqBNpYGh0dBBBct/SqGlAYmXWNCT3gdVNYYSpg5vHALQ7BE3M0QFVHcgtrg2oYmA3o4kNVPhREWJxHwAAWcxuPXMklgAAAABJRU5ErkJggg==', + 'C521' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcElEQVR4nGNYhQEaGAYTpIn7WENEQxlCGVqRxURaRRoYHR2mIosFNIo0sDYEhKKINYiEAEmYXrCTolZNXbpqZdZSZPcFNDA0OrSi2gEWm4Im1ijS6BCA7hbWVkYHVDHWEMYQ1tCA0IBBEH5UhFjcBwAy0sw4WrqJcgAAAABJRU5ErkJggg==', + '95C1' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7WANEQxlCHVqRxUSmiDQwOgRMRRYLaBVpYG0QCEUTC2FtYIDpBTtp2tSpS5euWrUU2X2srgyNrgh1ENiKKSbQKgIUE0BzC2sr0C0oYqwBjCFAN4cGDILwoyLE4j4AzazL4ocIyxoAAAAASUVORK5CYII=', + '04F6' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7GB0YWllDA6Y6IImxBjBMZW1gCAhAEhOZwhDKClQtgCQW0MroChJDdl/UUiAIXZmaheS+gFaRVqA6FPMCWkVDXYF6RVDtAKlDEQO6pRXdLWA3NzCguHmgwo+KEIv7AI8nyiFBRONoAAAAAElFTkSuQmCC', + '664D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7WAMYQxgaHUMdkMREprC2MrQ6OgQgiQW0iDQyTHV0EEEWawDyAuFiYCdFRk0LW5mZmTUNyX0hU0RbWRvR9LaKNLqGBmKIOaCpA7ulEdUt2Nw8UOFHRYjFfQBA4cxWv33QTgAAAABJRU5ErkJggg==', + 'B7EA' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QgNEQ11DHVqRxQKmMDS6NjBMdUAWawWLBQSgqmtlbWB0EEFyX2jUqmlLQ1dmTUNyH1BdAJI6qHmMDkCx0BAUMdYGDHVTRDDEQgOAYqGOKGIDFX5UhFjcBwC2isxJIZwHMgAAAABJRU5ErkJggg==', + '79AD' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAc0lEQVR4nGNYhQEaGAYTpIn7QkMZQximMIY6IIu2srYyhDI6BKCIiTQ6Ojo6iCCLTRFpdG0IhIlB3BS1dGnqqsisaUjuY3RgDERSB4asDQyNrqGoYiINLI3o6gIaWFtZgWIBKGKMIUAxVDcPUPhREWJxHwCF+Mv4IvVbMQAAAABJRU5ErkJggg==', + 'EAEF' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAW0lEQVR4nGNYhQEaGAYTpIn7QkMYAlhDHUNDkMQCGhhDWBsYHRhQxFhbMcVEGl0RYmAnhUZNW5kaujI0C8l9aOqgYqKhmGLY1GGKhYYAxUIdUcQGKvyoCLG4DwBiIsroECbW4wAAAABJRU5ErkJggg==', + 'E62B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QkMYQxhCGUMdkMQCGlhbGR0dHQJQxEQaWRsCHURQxYBkIEwd2EmhUdPCVq3MDM1Ccl9Ag2grQysjhnkOUxjRzWt0CEAXA7rFAVUvyM2soYEobh6o8KMixOI+ALZqy83M+3s7AAAAAElFTkSuQmCC', + 'F4E9' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7QkMZWllDHaY6IIkFNDBMZW1gCAhAFQtlbWB0EEERY3RFEgM7KTRq6dKloauiwpDcF9Ag0go0byqqXtFQVyCNKsYAUueARQzdLRhuHqjwoyLE4j4AIAbMRYqIlIAAAAAASUVORK5CYII=', + 'D85A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7QgMYQ1hDHVqRxQKmsLayNjBMdUAWaxVpdG1gCAhAEQOqm8roIILkvqilK8OWZmZmTUNyH0gdQ0MgTB3cPIeGwNAQDDvQ1AHdwujoiCIGcjNDKCOK2ECFHxUhFvcBAJG1zSNI9gjKAAAAAElFTkSuQmCC', + '4E5B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpI37poiGsoY6hjogi4WINLA2MDoEIIkxQsVEkMRYpwDFpsLVgZ00bdrUsKWZmaFZSO4LmALSFYhiXmgoREwExS0gOzDFGB0dUfSC3MwQyojq5oEKP+pBLO4DAAZCypGY43Q5AAAAAElFTkSuQmCC', + '9A39' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAeUlEQVR4nGNYhQEaGAYTpIn7WAMYAhhDGaY6IImJTGEMYW10CAhAEgtoZW1laAh0EEERE2l0aHSEiYGdNG3qtJVZU1dFhSG5j9UVpM5hKrJehlbRUIeGgAZkMQGQeQ0BKHaITBFpdEVzC2uASKMjmpsHKvyoCLG4DwBdRM1nwSL3cwAAAABJRU5ErkJggg==', + '27C3' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7WANEQx1AEElMZApDo6NDoEMAklhAK0Oja4NAgwiy7laGVlaQHLL7pq2atnTVqqVZyO4LYAhAUgeGjA6MDiAxZPNYwRDVDhEgZERzS2goUAWamwcq/KgIsbgPAEQfzBoT5lTqAAAAAElFTkSuQmCC', + '1F60' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYUlEQVR4nGNYhQEaGAYTpIn7GB1EQx1CGVqRxVgdRBoYHR2mOiCJiQLFWBscAgJQ9ILEQCTCfSuzpoYtnboyaxqS+8DqHB1h6pD0BmIRC8CwA8MtIUBdaG4eqPCjIsTiPgA/8skaq3bH7wAAAABJRU5ErkJggg==', + '98D8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYElEQVR4nGNYhQEaGAYTpIn7WAMYQ1hDGaY6IImJTGFtZW10CAhAEgtoFWl0bQh0EEERA6prCICpAztp2tSVYUtXRU3NQnIfqyuKOgjEYp4AFjFsbsHm5oEKPypCLO4DAExozQggqthMAAAAAElFTkSuQmCC', + 'F874' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAY0lEQVR4nGNYhQEaGAYTpIn7QkMZQ1hDAxoCkMQCGlhbgWQjqphIo0NDQCuGukaHKQFI7guNWhm2aumqqCgk94HVTWF0wDAvgDE0BE3M0YEBwy2sDehiQDejiQ1U+FERYnEfAF0Dz2BFrXwyAAAAAElFTkSuQmCC', + '002D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7GB0YAhhCGUMdkMRYAxhDGB0dHQKQxESmsLayNgQ6iCCJBbSKNDogxMBOilo6bWXWysysaUjuA6trZcTUOwVVDGQHQwCqGNgtDowobgG5mTU0EMXNAxV+VIRY3AcAEBnJpP1QmcoAAAAASUVORK5CYII=', + 'AF79' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7GB1EQ11DA6Y6IImxBogAyYCAACQxkSkgsUAHESSxgFYgr9ERJgZ2UtTSqWGrlq6KCkNyH1jdFIapyHpDQ4G8AKC5aOYxOjBg2MEKVBmAKYbi5oEKPypCLO4DAJvXzJhy1J4dAAAAAElFTkSuQmCC', + '1E70' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7GB1EQ1lDA1qRxVgdRIBkwFQHJDFRiFhAAIpeoFijI1gG5r6VWVPDVi1dmTUNyX1gdVMYYeoQYgGYYowODBh2sDYwoLolBOjmBgYUNw9U+FERYnEfADwGyNdF7VwnAAAAAElFTkSuQmCC', + '83A8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7WANYQximMEx1QBITmSLSyhDKEBCAJBbQytDo6OjoIIKijqGVtSEApg7spKVRq8KWroqamoXkPjR1cPNcQwNRzAOLNQSi2SGCoRfkZqAYipsHKvyoCLG4DwBIls1Ts1jRDAAAAABJRU5ErkJggg==', + '5453' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdklEQVR4nGNYhQEaGAYTpIn7QkMYWllDHUIdkMQCGhimsjYwOgSgioWyAmkRJLHAAEZX1qlgObj7wqYtXbo0M2tpFrL7WkVaQaqQzWNoFQXaGYBiXkAr0C1oYiJTGFoZHR1R3MIawNDKEMqA4uaBCj8qQizuAwC1xMyH7XMbKgAAAABJRU5ErkJggg==', + 'D938' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXUlEQVR4nGNYhQEaGAYTpIn7QgMYQxhDGaY6IIkFTGFtZW10CAhAFmsVaXRoCHQQQRdDqAM7KWrp0qVZU1dNzUJyX0ArY6ADhnkMWMxjwRTD4hZsbh6o8KMixOI+ABlRz0pe3VkyAAAAAElFTkSuQmCC', + '9163' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7WAMYAhhCGUIdkMREpjAGMDo6OgQgiQW0sgawNjg0iKCIMQDFgDSS+6ZNXRW1dOqqpVlI7mN1BapzdGhANo8BrDcAxTwBLGIiUxgw3AJ0SSi6mwcq/KgIsbgPAKy+yiVsZzuiAAAAAElFTkSuQmCC', + '40EB' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYElEQVR4nGNYhQEaGAYTpI37pjAEsIY6hjogi4UwhrA2MDoEIIkBRVpBYiJIYqxTRBpdEerATpo2bdrK1NCVoVlI7gtAVQeGoaEQMREUt2DawTAF0y1Y3TxQ4Uc9iMV9AHLlyhu9k5SfAAAAAElFTkSuQmCC', + '561D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QkMYQximMIY6IIkFNLC2MoQwOgSgiIk0MgLFRJDEAgOAvClwMbCTwqZNC1s1bWXWNGT3tYq2IqmDiok0OqCJBWARE5nCCtaL7BbWAKBLQh1R3DxQ4UdFiMV9AETryqt/mmzSAAAAAElFTkSuQmCC', + '0951' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7GB0YQ1hDHVqRxVgDWFtZGximIouJTBFpdG1gCEUWC2gFik1lgOkFOylq6dKlqZlZS5HdF9DKGOgAJFH1MjSii4lMYQHaEYDhFkZHVPeB3Ax0SWjAIAg/KkIs7gMAox3LzSafPvQAAAAASUVORK5CYII=', + '9333' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXElEQVR4nGNYhQEaGAYTpIn7WANYQxhDGUIdkMREpoi0sjY6OgQgiQW0MjQ6NAQ0iKCKQUUR7ps2dVXYqqmrlmYhuY/VFUUdBGIxTwCLGDa3YHPzQIUfFSEW9wEA1/HNeY5OYhUAAAAASUVORK5CYII=', + '88B8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAUUlEQVR4nGNYhQEaGAYTpIn7WAMYQ1hDGaY6IImJTGFtZW10CAhAEgtoFWl0bQh0EMGtDuykpVErw5aGrpqaheQ+Ys0jwg6cbh6o8KMixOI+ALskzXrMxfy/AAAAAElFTkSuQmCC', + '5F59' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7QkNEQ11DHaY6IIkFNIg0sDYwBARgiDE6iCCJBQYAxabCxcBOCps2NWxpZlZUGLL7WkEqAqYi64WKNSCLBbSC7AhAsUNkikgDo6MDiltYgfYyhDKguHmgwo+KEIv7ACDdzAmhHWYrAAAAAElFTkSuQmCC', + '9D43' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7WANEQxgaHUIdkMREpoi0MrQ6OgQgiQW0ijQ6THVoEEEXC3RoCEBy37Sp01ZmZmYtzUJyH6urSKNrI1wdBAL1uoYGoJgnADKvEdUOsFsaUd2Czc0DFX5UhFjcBwAgDc58de4yqgAAAABJRU5ErkJggg==' + ); + $this->text = array_rand( $images ); + return $images[ $this->text ] ; + } + + function out_processing_gif(){ + $image = dirname(__FILE__) . '/processing.gif'; + $base64_image = "R0lGODlhFAAUALMIAPh2AP+TMsZiALlcAKNOAOp4ANVqAP+PFv///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAIACwAAAAAFAAUAAAEUxDJSau9iBDMtebTMEjehgTBJYqkiaLWOlZvGs8WDO6UIPCHw8TnAwWDEuKPcxQml0Ynj2cwYACAS7VqwWItWyuiUJB4s2AxmWxGg9bl6YQtl0cAACH5BAUKAAgALAEAAQASABIAAAROEMkpx6A4W5upENUmEQT2feFIltMJYivbvhnZ3Z1h4FMQIDodz+cL7nDEn5CH8DGZhcLtcMBEoxkqlXKVIgAAibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAAROEMkphaA4W5upMdUmDQP2feFIltMJYivbvhnZ3V1R4BNBIDodz+cL7nDEn5CH8DGZAMAtEMBEoxkqlXKVIg4HibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAAROEMkpjaE4W5tpKdUmCQL2feFIltMJYivbvhnZ3R0A4NMwIDodz+cL7nDEn5CH8DGZh8ONQMBEoxkqlXKVIgIBibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAAROEMkpS6E4W5spANUmGQb2feFIltMJYivbvhnZ3d1x4JMgIDodz+cL7nDEn5CH8DGZgcBtMMBEoxkqlXKVIggEibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAAROEMkpAaA4W5vpOdUmFQX2feFIltMJYivbvhnZ3V0Q4JNhIDodz+cL7nDEn5CH8DGZBMJNIMBEoxkqlXKVIgYDibbK9YLBYvLtHH5K0J0IACH5BAUKAAgALAEAAQASABIAAAROEMkpz6E4W5tpCNUmAQD2feFIltMJYivbvhnZ3R1B4FNRIDodz+cL7nDEn5CH8DGZg8HNYMBEoxkqlXKVIgQCibbK9YLBYvLtHH5K0J0IACH5BAkKAAgALAEAAQASABIAAAROEMkpQ6A4W5spIdUmHQf2feFIltMJYivbvhnZ3d0w4BMAIDodz+cL7nDEn5CH8DGZAsGtUMBEoxkqlXKVIgwGibbK9YLBYvLtHH5K0J0IADs="; + $binary = is_file($image) ? join("",file($image)) : base64_decode($base64_image); + header("Cache-Control: post-check=0, pre-check=0, max-age=0, no-store, no-cache, must-revalidate"); + header("Pragma: no-cache"); + header("Content-type: image/gif"); + echo $binary; + } + +} +# end of class phpfmgImage +# ------------------------------------------------------ +# end of module : captcha + + +# module user +# ------------------------------------------------------ +function phpfmg_user_isLogin(){ + return ( isset($_SESSION['authenticated']) && true === $_SESSION['authenticated'] ); +} + + +function phpfmg_user_logout(){ + session_destroy(); + header("Location: admin.php"); +} + +function phpfmg_user_login() +{ + if( phpfmg_user_isLogin() ){ + return true ; + }; + + $sErr = "" ; + if( 'Y' == $_POST['formmail_submit'] ){ + if( + defined( 'PHPFMG_USER' ) && strtolower(PHPFMG_USER) == strtolower($_POST['Username']) && + defined( 'PHPFMG_PW' ) && strtolower(PHPFMG_PW) == strtolower($_POST['Password']) + ){ + $_SESSION['authenticated'] = true ; + return true ; + + }else{ + $sErr = 'Login failed. Please try again.'; + } + }; + + // show login form + phpfmg_admin_header(); +?> +
+ +


+ +
+
+
+ + + + + + + + + + + + +
Email : + +
Password : + +
+

+ {$sErr}

\n"; ?> + I forgot my password +
+
+
+ + + +
+ +


+ +
+
+
+Request Password +Enter Email Address :
+ +
+The password will be sent to this email address. +
{$sErr}

\n"; ?> +
+
+ + +" ); + echo "
Your password has been sent.

Click here to login again
"; + }; + phpfmg_admin_footer(); +} + + +function phpfmg_writable_check(){ + + if( is_writable( dirname(PHPFMG_SAVE_FILE) ) && is_writable( dirname(PHPFMG_EMAILS_LOGFILE) ) ){ + return ; + }; +?> + +

+
+
Your form data or email traffic log is NOT saving.
+ The form data () and email traffic log () will be created automatically when the form is submitted. + However, the script doesn't have writable permission to create those files. In order to save your valuable information, please set the directory to writable. + If you don't know how to do it, please ask for help from your web Administrator or Technical Support of your hosting company. +
+

+ PHPFMG_EMAILS_LOGFILE, + 2 => PHPFMG_SAVE_FILE, + ); + + phpfmg_admin_header(); + + $file = $files[$n]; + if( is_file($file) ){ + if( 1== $n ){ + echo "
\n";
+            echo join("",file($file) );
+            echo "
\n"; + }else{ + $man = new phpfmgDataManager(); + $man->displayRecords(); + }; + + + }else{ + echo "No form data found."; + }; + phpfmg_admin_footer(); +} + + +function phpfmg_log_download(){ + $n = isset($_REQUEST['file']) ? $_REQUEST['file'] : ''; + $files = array( + 1 => PHPFMG_EMAILS_LOGFILE, + 2 => PHPFMG_SAVE_FILE, + ); + + $file = $files[$n]; + if( is_file($file) ){ + phpfmg_util_download( $file, PHPFMG_SAVE_FILE == $file ? 'form-data.csv' : 'email-traffics.txt', true, 1 ); // skip the first line + }else{ + phpfmg_admin_header(); + echo "No email traffic log found."; + phpfmg_admin_footer(); + }; + +} + + +function phpfmg_log_delete(){ + $n = isset($_REQUEST['file']) ? $_REQUEST['file'] : ''; + $files = array( + 1 => PHPFMG_EMAILS_LOGFILE, + 2 => PHPFMG_SAVE_FILE, + ); + phpfmg_admin_header(); + + $file = $files[$n]; + if( is_file($file) ){ + echo unlink($file) ? "It has been deleted!" : "Failed to delete!" ; + }; + phpfmg_admin_footer(); +} + + +function phpfmg_util_download($file, $filename='', $toCSV = false, $skipN = 0 ){ + if (!is_file($file)) return false ; + + set_time_limit(0); + + + $buffer = ""; + $i = 0 ; + $fp = @fopen($file, 'rb'); + while( !feof($fp)) { + $i ++ ; + $line = fgets($fp); + if($i > $skipN){ // skip lines + if( $toCSV ){ + $line = str_replace( chr(0x09), ',', $line ); + $buffer .= phpfmg_data2record( $line, false ); + }else{ + $buffer .= $line; + }; + }; + }; + fclose ($fp); + + + + /* + If the Content-Length is NOT THE SAME SIZE as the real conent output, Windows+IIS might be hung!! + */ + $len = strlen($buffer); + $filename = basename( '' == $filename ? $file : $filename ); + $file_extension = strtolower(substr(strrchr($filename,"."),1)); + + switch( $file_extension ) { + case "pdf": $ctype="application/pdf"; break; + case "exe": $ctype="application/octet-stream"; break; + case "zip": $ctype="application/zip"; break; + case "doc": $ctype="application/msword"; break; + case "xls": $ctype="application/vnd.ms-excel"; break; + case "ppt": $ctype="application/vnd.ms-powerpoint"; break; + case "gif": $ctype="image/gif"; break; + case "png": $ctype="image/png"; break; + case "jpeg": + case "jpg": $ctype="image/jpg"; break; + case "mp3": $ctype="audio/mpeg"; break; + case "wav": $ctype="audio/x-wav"; break; + case "mpeg": + case "mpg": + case "mpe": $ctype="video/mpeg"; break; + case "mov": $ctype="video/quicktime"; break; + case "avi": $ctype="video/x-msvideo"; break; + //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files) + case "php": + case "htm": + case "html": + $ctype="text/plain"; break; + default: + $ctype="application/x-download"; + } + + + //Begin writing headers + header("Pragma: public"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Cache-Control: public"); + header("Content-Description: File Transfer"); + //Use the switch-generated Content-Type + header("Content-Type: $ctype"); + //Force the download + header("Content-Disposition: attachment; filename=".$filename.";" ); + header("Content-Transfer-Encoding: binary"); + header("Content-Length: ".$len); + + while (@ob_end_clean()); // no output buffering ! + flush(); + echo $buffer ; + + return true; + + +} +?> \ No newline at end of file diff --git a/abuse.lib.php b/abuse.lib.php new file mode 100644 index 0000000..8f9a304 --- /dev/null +++ b/abuse.lib.php @@ -0,0 +1,3390 @@ +unauthorized domain." ); + +define( 'PHPFMG_ONE_ENTRY' , '' ); +define( 'PHPFMG_ONE_ENTRY_METHOD' , '' ); + +phpfmg_init(); +# ----------------------------------------------------------------------------- + + + + + + + + + +function phpfmg_thankyou(){ + phpfmg_redirect_js(); +?> + + +
+ + Your form has been sent. Thank you! +

+ + + + + + "field_0", "text" => "Contact Name:", "type" => "sender's name", "instruction" => "", "required" => "Required" ) ; +$GLOBALS['form_mail']['field_1'] = array( "name" => "field_1", "text" => "Email Address:", "type" => "sender's email", "instruction" => "", "required" => "Required" ) ; +$GLOBALS['form_mail']['field_2'] = array( "name" => "field_2", "text" => "Subject:", "type" => "text", "instruction" => "", "required" => "Required" ) ; +$GLOBALS['form_mail']['field_3'] = array( "name" => "field_3", "text" => "Message:", "type" => "textarea", "instruction" => "", "required" => "Required" ) ; + + +/** + * GNU Library or Lesser General Public License version 2.0 (LGPLv2) +*/ + +function phpfmg_init(){ + + error_reporting( E_ERROR ); + ini_set('magic_quotes_runtime', 0); + ini_set( 'max_execution_time', 0 ); + ini_set( 'max_input_time', 36000 ); + + session_start(); + + if( !isset($_SESSION['HTTP_REFERER']) ) + $_SESSION['HTTP_REFERER'] = $_SERVER['HTTP_REFERER'] ; + phpfmg_check_referers(); + + if ( get_magic_quotes_gpc() && isset($_POST) ) { + phpfmg_stripslashes( $_POST ); + }; + +} + + +function phpfmg_stripslashes(&$var){ + if(!is_array($var)) { + $var = stripslashes($var); + } else { + array_walk($var,'phpfmg_stripslashes'); + }; +} + + +function phpfmg_display_form( $title="", $keywords="", $description="" ){ + @header( 'Content-Type: text/html; charset=' . PHPFMG_CHARSET ); + $phpfmg_send = phpfmg_sendmail( $GLOBALS['form_mail'] ) ; + $isHideForm = isset($phpfmg_send['isHideForm']) ? $phpfmg_send['isHideForm'] : false; + $sErr = isset($phpfmg_send['error']) ? $phpfmg_send['error'] : ''; + + # FormMail main() + phpfmg_header( $title, $keywords, $description ); + if( !$isHideForm ){ + phpfmg_form($sErr); + }else{ + phpfmg_thankyou(); + }; + phpfmg_footer(); + + return; +} + +function phpfmg_linebreak(){ + $os = strtolower(PHP_OS); + switch( true ){ + case ("\\" == DIRECTORY_SEPARATOR) : // windows + return "\x0d\x0a" ; + case ( strpos($os, 'darwin') !== false ) : // Mac + return "\x0d" ; + default : + return "\x0a" ; // *nix + }; +} + +function phpfmg_sendmail( &$form_mail ) { + if( !isset($_POST["formmail_submit"]) ) return ; + + $isHideForm = false ; + $sErr = checkPass($form_mail); + + $err_captcha = phpfmg_check_captcha(); + if( $err_captcha != '' ){ + $sErr['fields'][] = 'phpfmg_captcha'; + $sErr['errors'][] = ERR_CAPTCHA; + }; + + if( empty($sErr['fields']) && phpfmg_has_entry() ){ + $sErr['fields'][] = 'phpfmg_found_entry'; + $sErr['errors'][] = 'Found entry already!'; + }; + if( empty($sErr['fields']) ){ + + sendFormMail( $form_mail, PHPFMG_SAVE_FILE ) ; + $isHideForm = true; + // move the redirect to phpfmg_thankyou() to get around the redirection within an iframe problem + /* + $redirect = PHPFMG_REDIRECT; + if( strlen(trim($redirect)) ): + header( "Location: $redirect" ); + exit; + endif; + */ + }; + + return array( + 'isHideForm' => $isHideForm, + 'error' => $sErr , + ); +} + + +function phpfmg_has_entry(){ + if( !file_exists(PHPFMG_SAVE_FILE) ){ + return false; // has nothing to check + }; + + $found = false ; + if( defined('PHPFMG_ONE_ENTRY') && 'Y' == PHPFMG_ONE_ENTRY ){ + $query = defined('PHPFMG_ONE_ENTRY_METHOD') && PHPFMG_ONE_ENTRY_METHOD == 'email' && isset($GLOBALS['sender_email']) ? $GLOBALS['sender_email'] : $_SERVER['REMOTE_ADDR'] ; + if( empty($query) ) + return false ; + + $GLOBALS['OneEntry'] = $query; + $query = '"'. strtolower($query) . '"'; + $handle = fopen(PHPFMG_SAVE_FILE,'r'); + if ($handle) { + while (!feof($handle)) { + $entry = strtolower(fgets($handle, 4096)); + if( strpos($entry,$query) !== false ){ + $found = true ; + break; + }; + }; + fclose($handle); + }; + }; + return $found ; + +} + +function sendFormMail( $form_mail, $sFileName = "" ) +{ + $to = filterEmail(PHPFMG_TO) ; + $cc = filterEmail(PHPFMG_CC) ; + $bcc = filterEmail(PHPFMG_BCC) ; + + // simply chop email address to avoid my website being abused + if( false !== strpos( strtolower($_SERVER['HTTP_HOST']),'formmail-maker.com') ){ + $cc = substr($cc, 0, 50); + $bcc = substr($bcc,0, 50); + }; + + + $subject = PHPFMG_SUBJECT ; + $from = $to ; + $fromName = ""; + $titleOfSender = ''; + $firstName = ""; + $lastName = ""; + + $strip = get_magic_quotes_gpc() ; + $content = '' ; + $style = 'font-family:Verdana, Arial, Helvetica, sans-serif; font-size : 13px; color:#474747;padding:6px;border-bottom:1px solid #cccccc;' ; + $tr = array() ; // html table + $csvValues = array(); + $cols = array(); + $replace = array(); + $RecordID = phpfmg_getRecordID(); + $isWritable = is_writable( dirname(PHPFMG_SAVE_ATTACHMENTS_DIR) ); + + foreach( $form_mail as $field ){ + $field_type = strtolower($field[ "type" ]); + if( 'sectionbreak' == $field_type ){ + continue; + }; + + $field[ "text" ] = stripslashes( $field[ "text" ] ); + //$value = trim( $_POST[ $field[ "name" ] ] ); + $value = phpfmg_field_value( $field[ "name" ] ); + $value = $strip ? stripslashes($value) : $value ; + if( 'attachment' == $field_type ){ + $value = $isWritable ? phpfmg_file2value( $RecordID, $_FILES[ $field[ "name" ] ] ) : $_FILES[ $field[ "name" ] ]['name']; + //$value = $_FILES[ $field[ "name" ] ]['name']; + }; + + $content .= $field[ "text" ] . " \t : " . $value .PHPFMG_LNCR; + $tr[] = " " . $field[ "text" ] . "  " . nl2br($value) . " " ; + $csvValues[] = csvfield( $value ); + $cols[] = csvfield( $field[ "text" ] ); + $replace["%".$field[ "name" ]."%"] = $value; + + switch( $field_type ){ + case "sender's email" : + $from = filterEmail($value) ; + break; + case "sender's name" : + $fromName = filterEmail($value) ; + break; + case "titleofsender" : + $titleOfSender = $value ; + break; + case "senderfirstname" : + $firstName = filterEmail($value) ; + break; + case "senderlastname" : + $lastName = filterEmail($value) ; + break; + default : + // nothing + }; + + }; // for + + $isHtml = 'html' == PHPFMG_MAIL_TYPE ; + + if( $isHtml ) { + $content = "" . PHPFMG_LNCR . join( PHPFMG_LNCR, $tr ) . PHPFMG_LNCR . "
" ; + }; + + + if( !empty($firstName) && !empty($lastName) ){ + $fromName = $firstName . ' ' . $lastName; + }; + $fromHeader = filterEmail( ('' != $fromName ? "\"$fromName\"" : '' ) . " <{$from}>",array(",", ";")) ; // no multiple emails are allowed. + $GLOBALS['ReplyTo'] = $fromHeader; + + $_fields = array( + '%NameOfSender%' => $fromName, + '%FirstNameOfSender%' => $firstName, + '%LastNameOfSender%' => $lastName, + '%EmailOfSender%' => $from, + '%TitleOfSender%' => $titleOfSender, + '%DataOfForm%' => $content, + '%IP%' => $_SERVER['REMOTE_ADDR'], + '%Date%' => date("Y-m-d"), + '%Time%' => date("H:i:s"), + '%HTTP_HOST%' => $_SERVER['HTTP_HOST'], + '%FormPageLink%' => phpfmg_request_uri(), + '%HTTP_REFERER%' => $_SESSION['HTTP_REFERER'], + '%AutoID%' => $RecordID, + '%FormAdminURL%' => phpfmg_admin_url() + ); + $fields = array_merge( $_fields, $replace ); + + $esh_mail_template = trim(phpfmg_mail_template()); + if( !empty($esh_mail_template) ){ + $esh_mail_template = phpfmg_adjust_template($esh_mail_template); + $content = phpfmg_parse_mail_body( $esh_mail_template, $fields ); + }; + $subject = phpfmg_parse_mail_body( $subject, $fields ); + + if( $isHtml ) { + $content = phpfmg_getHtmlContent( $content ); + }; + + $oldMask = umask(0); + //$sep = ','; //chr(0x09); + $sep = chr(0x09); + $recordCols = phpfmg_data2record( csvfield('RecordID') . $sep . csvfield('Date') . $sep . csvfield('IP') . $sep . join($sep,$cols) ); + $record = phpfmg_data2record( csvfield($RecordID) . $sep . csvfield(date("Y-m-d H:i:s")) . $sep . csvfield($_SERVER['REMOTE_ADDR']) .$sep . join($sep,$csvValues) ); + + + /* + Some hosting companies (like Yahoo and GoDaddy) REQUIRED a registered email address to send out all emails! + The mailer HAS to use the REGISTERED email address as the sender's email address. This is called the sendmail_from. + */ + $sendmail_from = $from; + $sender_email = $from; + $force_sender = defined('PHPFMG_SENDMAIL_FROM') && '' != PHPFMG_SENDMAIL_FROM ; + if( $force_sender ){ + ini_set("sendmail_from", PHPFMG_SENDMAIL_FROM); + $sendmail_from = PHPFMG_SENDMAIL_FROM; + }; + if( defined('PHPFMG_SMTP') && '' != PHPFMG_SMTP ){ + ini_set("SMTP", PHPFMG_SMTP); + }; + + + + switch( strtolower(PHPFMG_ACTION) ){ + case 'fileonly' : + appendToFile( $sFileName, $record, $recordCols ); + break; + case 'mailonly' : + mailAttachments( $to , $subject , $content, $sendmail_from, $fromName, $fromHeader, $cc , $bcc, PHPFMG_CHARSET ) ; + break; + case 'mailandfile' : + default: + mailAttachments( $to , $subject , $content, $sendmail_from, $fromName, $fromHeader, $cc , $bcc, PHPFMG_CHARSET ) ; + appendToFile( $sFileName, $record, $recordCols ); + }; // switch + + mailAutoResponse( $sender_email, $force_sender ? $sendmail_from : $to, $fields ) ; + umask($oldMask); + + session_destroy(); + session_regenerate_id(true); +} + + + + + +function phpfmg_file2value( $recordID, $file ){ + $tmp = $file[ "tmp_name" ] ; + $name = phpfmg_rename_harmful(trim($file[ "name" ])) ; + if( !defined('PHPFMG_FILE2LINK_SIZE') ){ + return $name; + }; + + if( is_uploaded_file( $tmp ) ) { + $size = trim(PHPFMG_FILE2LINK_SIZE) ; + switch( $size ){ + case '' : + return $name; + default: + $isHtml = 'html' == PHPFMG_MAIL_TYPE; + $filelink = base64_encode($recordID . '-' . $name); + $url = phpfmg_admin_url() . "?mod=filman&func=download&filelink=" . urlencode($filelink) ; + $isLarger = (filesize($tmp)/1024) > $size ; + $link = $isHtml ? "$name" : $name . " ( {$url} )"; + return $isLarger ? $link : $name ; // email download link when size is larger defined size, otherwise send as attachment + };// switch + }; // if + + return $name; +} + + +function phpfmg_dir2unix( $dir ){ + return str_replace( array("\\", '//'), '/', $dir ); +} + + + +function phpfmg_request_uri(){ + $uri = getEnv('REQUEST_URI'); // apache has this + if( false !== $uri && strlen($uri) > 0 ){ + return $uri ; + } else { + + $uri = ($uri = getEnv('SCRIPT_NAME')) !== false + ? $uri + : getEnv('PATH_INFO') ; + $qs = getEnv('QUERY_STRING'); // IIS and Apache has this + return $uri . ( empty($qs) ? '' : '?' . $qs ); + + }; + return "" ; +} + + + + +// parse full admin url to view large size uploaded file online +function phpfmg_admin_url(){ + $http_host = "http://{$_SERVER['HTTP_HOST']}"; + switch( true ){ + case (0 === strpos(PHPFMG_ADMIN_URL, 'http://' )) : + $url = PHPFMG_ADMIN_URL; + break; + case ( '/' == substr(PHPFMG_ADMIN_URL,0,1) ) : + $url = $http_host . PHPFMG_ADMIN_URL ; + break; + default: + $uri = phpfmg_request_uri(); + $pos = strrpos( $uri, '/' ); + $vdir = substr( $uri, 0, $pos ); + $url = $http_host . $vdir . '/' . PHPFMG_ADMIN_URL ; + }; + return $url; +} + + + +function phpfmg_ispost(){ + return 'POST' == strtoupper($_SERVER["REQUEST_METHOD"]) || 'POST' == strtoupper(getEnv('REQUEST_METHOD')) ; +} + + +function phpfmg_is_mysite(){ + return false !== strpos( strtolower($_SERVER['HTTP_HOST']),'formmail-maker.com'); // accessing form at mysite +} + +// don't allow hotlink form to my website. To avoid people create phishing form. +function phpfmg_hotlinking_mysite(){ + $yes = phpfmg_is_mysite() + && ( empty($_SERVER['HTTP_REFERER']) || false === strpos( strtolower($_SERVER['HTTP_REFERER']),'formmail-maker.com') ) ; // doesn't have referer of mysite + + if( $yes ){ + die( "Access Denied. +

+ You are visiting a form hotlinkink from formmail-maker.com which is not allowed. + Please read the FAQ. + " ); + }; +} + + + +function phpfmg_check_referers(){ + + phpfmg_hotlinking_mysite(); // anti phishing + + $debugs = array(); + $debugs[] = "Your IP: " . $_SERVER['REMOTE_ADDR']; + $debugs[] = "Referer link: " . $_SERVER['HTTP_REFERER']; + $debugs[] = "Host of referer: $referer"; + + $check = defined('PHPFMG_ANTI_HOTLINKING') && 'Y' == PHPFMG_ANTI_HOTLINKING; + if( !$check ) { + $debugs[] = "Referer is empty. No need to check hot linking."; + //echo "
" . join("\n",$debugs) . "
\n"; + //appendToFile( PHPFMG_EMAILS_LOGFILE, date("Y-m-d H:i:s") . "\t" . $_SERVER['REMOTE_ADDR'] . " \n" . join("\n",$debugs) ) ; + return true; + }; + + // maybe post from local file + if( !isset($_SERVER['HTTP_REFERER']) && phpfmg_ispost() ){ + appendToFile( PHPFMG_EMAILS_LOGFILE, date("Y-m-d H:i:s") . "\t" . $_SERVER['REMOTE_ADDR'] . " \n phpfmg_ispost " . join("\n",$debugs) ) ; + die( PHPFMG_REFERERS_DENIED_MSG ); + }; + + + $url = parse_url($_SERVER['HTTP_REFERER']); + $referer = str_replace( 'www.', '', strtolower($url['host']) ); + if( empty($referer) ) { + return true; + }; + + $hosts = explode(',',PHPFMG_REFERERS_ALLOW); + $http_host = strtolower($_SERVER['HTTP_HOST']); + $referer = $http_host ; + $hosts[] = str_replace('www.', '', $http_host ); + + $debugs[] = "Hosts Allow: " . PHPFMG_REFERERS_ALLOW; + + $allow = false ; + foreach( $hosts as $host ){ + $host = strtolower(trim($host)); + $debugs[] = "check host: $host " ; + if( false !== strpos($referer, $host) || false !== strpos($referer, 'www.'.$host) ){ + $allow = true; + $debugs[] = " -> allow (quick exit)"; + break; + }else{ + $debugs[] = " -> deny"; + }; + }; + + //echo "
" . join("\n",$debugs) . "
\n"; + //appendToFile( PHPFMG_EMAILS_LOGFILE, date("Y-m-d H:i:s") . "\t" . $_SERVER['REMOTE_ADDR'] . " \n" . join("\n",$debugs) ) ; + + if( !$allow ){ + die( PHPFMG_REFERERS_DENIED_MSG ); + }; +} + + + +function phpfmg_getRecordID(){ + if( !isset($GLOBALS['RecordID']) ){ + $GLOBALS['RecordID'] = date("Ymd") . '-'. substr( md5(uniqid(rand(), true)), 0,4 ); + }; + return $GLOBALS['RecordID']; +} + + + +function phpfmg_data2record( $s, $b=true ){ + $from = array( "\r", "\n"); + $to = array( "\\r", "\\n" ); + return $b ? str_replace( $from, $to, $s ) : str_replace( $to, $from, $s ) ; +} + + + +function csvfield( $str ){ + $str = str_replace( '"', '""', $str ); + return '"' . trim($str) . '"'; +} + + + +function mailAttachments( $to = "" , $subject = "" , $message = "" , $from="", $fromName = "" , $fromHeader ="", $cc = "" , $bcc = "", $charset = "UTF-8", $type = 'FormMail' ){ + + if( ! strlen( trim( $to ) ) ) return "Missing \"To\" Field." ; + + $isAutoResponse = $type == 'AutoResponseEmail' ; + // added PHPMailer SMTP support at Mar 12, 2011 + $isSMTP = defined('PHPFMG_USE_SMTP') && 'Y' == PHPFMG_USE_SMTP && defined('PHPFMG_SMTP_HOST') && '' != PHPFMG_SMTP_HOST; + + // due to security issues, in most case, the smtp will fail on my website. It only works on user's own server + // so just disable the smtp here + if( phpfmg_is_mysite() ){ + $isSMTP = false ; + }; + + $attachments = array(); + $noAutoAttachements = $isAutoResponse && defined('PHPFMG_RETURN_NO_ATTACHMENT') && 'Y' == PHPFMG_RETURN_NO_ATTACHMENT ; + $use_phpmailer = defined('PHPFMG_USE_PHPMAILER') && 'Y' == PHPFMG_USE_PHPMAILER ; + + + $boundary = "====_My_PHP_Form_Generator_" . md5( uniqid( srand( time() ) ) ) . "===="; + $content_type = 'html' == PHPFMG_MAIL_TYPE ? "text/html" : "text/plain" ; + + // setup mail header infomation + $headers = 'Y' == PHPFMG_NO_FROM_HEADER ? '' : "From: {$fromHeader}" .PHPFMG_LNCR; + $headers .= "Reply-To: {$GLOBALS['ReplyTo']}" .PHPFMG_LNCR; + if ($cc) $headers .= "CC: $cc".PHPFMG_LNCR; + if ($bcc) $headers .= "BCC: $bcc".PHPFMG_LNCR; + //$headers .= "Content-type: {$content_type}; charset={$charset}" .PHPFMG_LNCR ; + + $plainHeaders = $headers ; // for no attachments header + $plainHeaders .= 'MIME-Version: 1.0' . PHPFMG_LNCR; + $plainHeaders .= "Content-type: {$content_type}; charset={$charset}" ; + + //create mulitipart attachments boundary + $sError = "" ; + $nFound = 0; + + + if( false && isset($GLOBALS['phpfmg_files_content']) && '' != $GLOBALS['phpfmg_files_content'] ){ + + // use previous encoded content + $sEncodeBody = $GLOBALS['phpfmg_files_content'] ; + $nFound = $GLOBALS['phpfmg_nFound'] ; + + }else{ + + $file2link_size = trim(PHPFMG_FILE2LINK_SIZE) ; + $isSave = ('' != $file2link_size || defined('PHPFMG_SAVE_ATTACHMENTS') && 'Y' == PHPFMG_SAVE_ATTACHMENTS); + if( $isSave ){ + if( defined('PHPFMG_SAVE_ATTACHMENTS_DIR') ){ + if( !is_dir(PHPFMG_SAVE_ATTACHMENTS_DIR) ){ + $ok = @mkdir( PHPFMG_SAVE_ATTACHMENTS_DIR, 0777 ); + if( !$ok ) $isSave = false; + }; + }; + }; + + $isWritable = is_writable( dirname(PHPFMG_SAVE_ATTACHMENTS_DIR) ); + // parse attachments content + foreach( $_FILES as $aFile ){ + $sFileName = $aFile[ "tmp_name" ] ; + $sFileRealName = phpfmg_rename_harmful($aFile[ "name" ]) ; + if( is_uploaded_file( $sFileName ) ): + + $isSkip = '' != $file2link_size && ( (filesize($sFileName)/1024) > $file2link_size ); + // save uploaded file + if( $isWritable && $isSave ){ + $tofile = PHPFMG_SAVE_ATTACHMENTS_DIR . phpfmg_getRecordID() . '-' . basename($sFileRealName); + if( @copy( $sFileName, $tofile) ) { + $sFileName = $tofile; // to fix problem : in some windows php, the uploaded temp file might not be mailed as attachment + chmod($tofile,0777); + }; + }; + + if( $isSkip ) + continue; // mail file as link + + $attachments[] = array('file' => $sFileName, 'name' => $aFile[ "name" ] ); + + if( !$use_phpmailer && !$isSMTP && ($fp = @fopen( $sFileName, "rb" )) ) : + $sContent = fread( $fp, filesize( $sFileName ) ); + fclose($fp); + $sFName = basename( $sFileRealName ) ; + $sMIME = getMIMEType( $sFName ) ; + + $bPlainText = ( $sMIME == "text/plain" ) ; + if( $bPlainText ) : + $encoding = "" ; + else: + $encoding = "Content-Transfer-Encoding: base64".PHPFMG_LNCR; + $sContent = chunk_split( base64_encode( $sContent ) ); + endif; + + $sEncodeBody .= PHPFMG_LNCR."--$boundary" .PHPFMG_LNCR. + "Content-Type: $sMIME;" . PHPFMG_LNCR. + "\tname=\"$sFName\"" . PHPFMG_LNCR. + $encoding . + "Content-Disposition: attachment;" . PHPFMG_LNCR. + "\tfilename=\"$sFName\"" . PHPFMG_LNCR. PHPFMG_LNCR. + $sContent . PHPFMG_LNCR ; + $nFound ++; + else: + $sError .= "
Failed to open file $sFileName.\n" ; + endif; // if( $fp = fopen( $sFileName, "rb" ) ) : + + else: + $sError .= "
File $sFileName doesn't exist.\n" ; + endif; //if( file_exists( $sFileName ) ): + }; // end foreach + + $sEncodeBody .= PHPFMG_LNCR.PHPFMG_LNCR."--$boundary--" ; + + $GLOBALS['phpfmg_files_content'] = $sEncodeBody ; + $GLOBALS['phpfmg_nFound'] = $nFound ; + + }; // if + + $headers .= "MIME-Version: 1.0".PHPFMG_LNCR."Content-type: multipart/mixed;".PHPFMG_LNCR."\tboundary=\"$boundary\""; + $txtMsg = PHPFMG_LNCR."This is a multi-part message in MIME format." .PHPFMG_LNCR . + PHPFMG_LNCR."--$boundary" .PHPFMG_LNCR . + "Content-Type: {$content_type};".PHPFMG_LNCR. + "\tcharset=\"$charset\"" .PHPFMG_LNCR.PHPFMG_LNCR . + $message . PHPFMG_LNCR; + + + if( $noAutoAttachements ) $sEncodeBody = '' ; + + $body = $nFound ? $txtMsg . $sEncodeBody : $message ; + $headers = $nFound ? $headers : $plainHeaders ; + + + $errmsg = ""; + if( $isSMTP || $use_phpmailer ){ + if( $noAutoAttachements ) $attachments = false ; + $errmsg = phpfmg_phpmailer( $to, $subject, $body, $from, $fromName, $cc , $bcc , $charset, $attachments ); + + }else{ + + if ( !mail( $to, $subject, $body, $headers ) ) + $errmsg = "Failed to send mail"; + }; + + $ok = $errmsg == "" ; + $status = $ok ? "\n[Email sent]" : "\n[{$errmsg}]" ; + phpfmg_log_mail( $to, $subject, ($ok ? 'Email sent' : 'Failed to send mail') . "\n" . ($nFound ? $headers . $txtMsg : $headers . $message), '', $type . $status ); // no log for attachments + + return $sError ; +} + + +function phpfmg_phpmailer( $to, $subject, $message, $from, $fromName, $cc = "" , $bcc = "", $charset = "UTF-8",$attachments = false ){ + + $mail = new PHPMailer(); + $mail->Host = PHPFMG_SMTP_HOST; // SMTP server + $mail->Username = PHPFMG_SMTP_USER; + $mail->Password = PHPFMG_SMTP_PLAIN_PASSWORD != '' ? PHPFMG_SMTP_PLAIN_PASSWORD : base64_decode(PHPFMG_SMTP_PASSWORD); + $mail->SMTPAuth = PHPFMG_SMTP_PASSWORD != ""; + $mail->SMTPSecure = PHPFMG_SMTP_SECURE; + $mail->Port = PHPFMG_SMTP_PORT == "" ? 25 : PHPFMG_SMTP_PORT; + if( defined('PHPFMG_SMTP_DEBUG_LEVEL') && PHPFMG_SMTP_DEBUG_LEVEL != "" ){ + $mail->SMTPDebug = (int)PHPFMG_SMTP_DEBUG_LEVEL ; + }; + + if( isset($GLOBALS['ReplyTo']) ) $mail->AddReplyTo($GLOBALS['ReplyTo']); + $mail->From = $from; + $mail->FromName = $fromName; + $mail->Subject = $subject; + $mail->Body = $message; + $mail->CharSet = $charset; + + if( !phpfmg_is_mysite() && (defined('PHPFMG_USE_SMTP') && 'Y' == PHPFMG_USE_SMTP) ){ + $mail->IsSMTP(); + }; + + $mail->IsHTML('html' == PHPFMG_MAIL_TYPE); + + $mail->AddAddress($to); + + if( ''!= $cc ){ + $CCs = explode(',',$cc); + foreach($CCs as $c){ + $mail->AddCC( $c ); + }; + }; + + if( ''!= $bcc ){ + $BCCs = explode(',',$bcc); + foreach($BCCs as $b){ + $mail->AddBCC( $b ); + }; + }; + + + if( is_array($attachments) ){ + foreach($attachments as $f){ + $mail->AddAttachment( $f['file'], basename($f['name']) ); + }; + }; + + return $mail->Send() ? "" : $mail->ErrorInfo; + +} + + + +function mailAutoResponse( $to, $from, $fields = false ){ + if( !formIsEMail($to) ) return ERR_EMAIL ; // one more check for spam robot + $enable = defined('PHPFMG_RETURN_ENABLE') && PHPFMG_RETURN_ENABLE === 'Y'; + $body = trim(phpfmg_auto_response_message()); + if( !$enable || empty($body) ){ + return false ; + }; + + $subject = PHPFMG_RETURN_SUBJECT; + $isHtml = 'html' == PHPFMG_MAIL_TYPE ; + $body = phpfmg_adjust_template($body); + $body = phpfmg_parse_mail_body($body,$fields); + $subject = phpfmg_parse_mail_body( $subject, $fields ); + if( $isHtml ) { + $body = phpfmg_getHtmlContent( $body ); + }; + $body = str_replace( "0x0d", '', $body ); + $body = str_replace( "0x0a", PHPFMG_LNCR, $body ); + + if( defined('PHPFMG_RETURN_EMAIL') && formIsEMail(PHPFMG_RETURN_EMAIL) ){ + $from = PHPFMG_RETURN_EMAIL; + }; + $fromHeader = ( PHPFMG_YOUR_NAME == "" ? "" : "\"".PHPFMG_YOUR_NAME . "\"" ) . " <{$from}>"; + return mailAttachments( $to , $subject , $body, filterEmail($from), PHPFMG_YOUR_NAME, $fromHeader, '' , '', PHPFMG_CHARSET, 'AutoResponseEmail' ); + +} + + +function phpfmg_log_mail( $to='', $subject='', $body='', $headers = '', $type='' ){ + $sep = PHPFMG_LNCR . str_repeat('----',20) . PHPFMG_LNCR ; + appendToFile( PHPFMG_EMAILS_LOGFILE, date("Y-m-d H:i:s") . "\t" . $_SERVER['REMOTE_ADDR'] . "\t{$type}" . $sep . "To: {$to}\r\nSubject: {$subject}\r\n" . $headers . $body . "
" . PHPFMG_LNCR . $sep . PHPFMG_LNCR ) ; +} + + + +function phpfmg_getHtmlContent( $body ){ + $html = "Your Form Mail Content | htttp://phpfmg.sourceforge.net" + . $body .""; + return $html ; +} + + + +function phpfmg_adjust_template( $body ){ + $isHtml = 'html' == PHPFMG_MAIL_TYPE ; + if( $isHtml ){ + $body = preg_match( "/<[^<>]+>/", $body ) ? $body : nl2br($body); + }; + return $body; +} + + + +function phpfmg_parse_mail_body( $body, $fields = false ){ + if( !is_array($fields) ) + return $body ; + + $yes = function_exists( 'str_ireplace' ); + foreach( $fields as $name => $value ){ + $body = $yes ? str_ireplace( $name, $value ,$body ) + : str_replace ( $name, $value ,$body ); + }; + return trim($body); +} + + + +# filter line breaks to avoid emails injecting +function filterEmail($email, $chars = ''){ + $email = trim(str_replace( array("\r","\n"), '', $email )); + if( is_array($chars) ) $email = str_replace( $chars, '', $email ); + $email = preg_replace( '/(cc\s*\:|bcc\s*\:)/i', '', $email ); + return $email; +} + + + +function mailReport( $content = "", $file = '' ){ + $content = " +Dear Sir or Madam, + +Your online form at " . HOST_NAME . PHP_SELF . " failed to save data to file. Please make sure the web user has permission to write to file \"{$file}\". If you don't know how to fix it, please forward this email to technical support team of your web hosting company or your Administrator. + +PHPFMG +- PHP FormMail Generator +"; + mail(PHPFMG_TO, "Error@" . HOST_NAME . PHP_SELF, $content ); +} + + + +function remove_newline( $str = "" ){ + return str_replace( array("\r\n", "\r", "\n"), array('\r\n', '\r', '\n'), $str ); +} + + + +function checkPass( $form_mail = array() ) +{ + + $names = array(); + $labels = array(); + + foreach( $form_mail as $field ){ + $type = strtolower( $field[ "type" ] ); + //$value = trim( $_POST[ $field[ "name" ] ] ); + $value = phpfmg_field_value( $field[ "name" ] ); + $required = strtolower($field[ "required" ]) ; + $text = stripslashes( $field[ "text" ] ); + + // simple check the field has something keyed in. + if( !strlen($value) && ( $required == "required" ) && $type != "attachment" ){ + $names[] = $field[ "name" ]; + $labels[] = $text; + //return ERR_MISSING . $text ; + continue; + }; + + // verify the special case + if( + ( strlen($value) || $type == "attachment" ) + && $required == "required" + ): + + switch( $type ){ + case strtolower("Sender's Name") : + break; + case strtolower("Generic email"): + case strtolower("Sender's email"): + if( ! formIsEMail($value) ) { + $names[] = $field[ "name" ]; + $labels[] = $text . ERR_EMAIL; + //return ERR_EMAIL . $text ; + }; + // for checking entry limitation + if( $type == "sender's email" ){ + $GLOBALS['sender_email'] = $value; + }; + break; + case "text" : + break; + case "textarea" : + break; + case "checkbox" : + case "radio" : + break; + case "select" : + break; + case "attachment" : + $upload_file = $_FILES[ $field["name"] ][ "tmp_name" ] ; + if( ! is_uploaded_file($upload_file) ){ + $names[] = $field[ "name" ]; + $labels[] = $text; + //return ERR_SELECT_UPLOAD . $text; + }; + break; + case strtolower("Date(MM-DD-YYYY)"): + break; + case strtolower("Date(MM-YYYY)"): + break; + case strtolower("CreditCard(MM-YYYY)"): + if( $value < date("Y-m") ) { + $names[] = $field[ "name" ]; + $labels[] = $text; + //return ERR_CREDIT_CARD_EXPIRED . $text; + }; + break; + case strtolower("CreditCard#"): + if( !formIsCreditNumber( $value ) ) { + $names[] = $field[ "name" ]; + $labels[] = $text; + //return ERR_CREDIT_CARD_NUMBER . $text ; + }; + break; + case strtolower("Time(HH:MM:SS)"): + break; + case strtolower("Time(HH:MM)"): + break; + default : + //return $sErrRequired . $form_mail[ $i ][ "text" ]; + }; // switch + endif; + }; // for + + return array( + 'fields' => $names, + 'errors' => $labels, + ); +} + + + +function formSelected( $var, $val ) +{ + echo ( $var == $val ) ? "selected" : ""; +} + + + +function formChecked( $var, $val ) +{ + echo ( $var == $val ) ? "checked" : ""; +} + + + +function formIsEMail( $email ){ + return preg_match( "/^(.+)@(.+)\\.(.+)$/", $email ); +} + + + +function selectList( $name, $selectedValue, $start, $end, $prompt = "-Select-", $style = "" ) +{ + $tab = "\t" ; + print "\n\n" ; +} + + + +# something like CreditCard.pm in perl CPAN +function formIsCreditNumber( $number ) { + + $tmp = $number; + $number = preg_replace( "/[^0-9]/", "", $tmp ); + + if ( preg_match( "/[^\d\s]/", $number ) ) return 0; + if ( strlen($number) < 13 && 0+$number ) return 0; + + for ($i = 0; $i < strlen($number) - 1; $i++) { + $weight = substr($number, -1 * ($i + 2), 1) * (2 - ($i % 2)); + $sum += (($weight < 10) ? $weight : ($weight - 9)); + } + + if ( substr($number, -1) == (10 - $sum % 10) % 10 ) return $number; + return $number; +} + + +/* --------------------------------------------------------------------------------------------------- + Parameters: $sFileName + Return : + 1. "" : no extendsion name, or sFileName is empty + 2. string: MIME Type name of array aMimeType's definition. + ---------------------------------------------------------------------------------------------------*/ +function getMIMEType( $sFileName = "" ) { + $sFileName = strtolower( trim( $sFileName ) ); + if( ! strlen( $sFileName ) ) return ""; + + $aMimeType = array( + "txt" => "text/plain" , + "pdf" => "application/pdf" , + "zip" => "application/x-compressed" , + + "html" => "text/html" , + "htm" => "text/html" , + + "avi" => "video/avi" , + "mpg" => "video/mpeg " , + "wav" => "audio/wav" , + + "jpg" => "image/jpeg " , + "gif" => "image/gif" , + "tif" => "image/tiff " , + "png" => "image/x-png" , + "bmp" => "image/bmp" + ); + $aFile = explode( "\.", basename( $sFileName ) ) ; + $nDiminson = count( $aFile ) ; + $sExt = $aFile[ $nDiminson - 1 ] ; // get last part: like ".tar.zip", return "zip" + + return ( $nDiminson > 1 ) ? $aMimeType[ $sExt ] : ""; +} + + + +function appendToFile( $sFileName = "", $line = "", $dataColumnsLine = '' ){ + $obey = defined('PHPFMG_GDPR') && 'Y' == PHPFMG_GDPR; // obey General Data Protection Regulation (GDPR)? + if( $obey ) return 0; + + if( !$sFileName || !$line ) return 0; + + $isExists = file_exists( $sFileName ); + $hFile = @fopen( "$sFileName", "a+w" ); + $nBytes = 0; + if( $hFile ){ + if( !$isExists && false !== strpos(strtolower(basename($sFileName)), '.php') ){ + fputs( $hFile, "\r\n"); + if( !empty($dataColumnsLine) ){ + fputs($hFile,$dataColumnsLine."\r\n"); + }; + }; + $nBytes = fputs( $hFile , trim($line)."\r\n" ); + fclose( $hFile ); + }; + return $nBytes ; +} + +function phpfmg_get_csv_header(){ + $csvValues = array(); + foreach( $GLOBALS['form_mail'] as $field ){ + $csvValues[] = csvfield( $field[ "text" ] ); + }; + return join(chr(0x09),/*","*/$csvValues) ; +} + +/* +function phpfmg_field_instruction($name, $show = true ){ + global $form_mail, $sErr; + $isError = in_array($name,$sErr['fields']); + $class = $isError ? 'instruction_error' : 'instruction' ; + if( $show || $isError ) echo "
". htmlspecialchars_decode($form_mail[ $name ]['instruction']) . "
"; +} +*/ + +function phpfmg_rand( $len = 4 ){ + $md5 = md5( uniqid(rand()) ); + return $len > 0 ? substr($md5,0,$len) : $md5 ; +} + + + +// use a random name for stopping spam bot bypass the form.php, and post raw data directly +function phpfmg_captcha_name(){ + if( !isset($_SESSION['captcha_name']) ){ + $_SESSION['captcha_name'] = phpfmg_rand(8); //PHPFMG_ID.'fmgCaptchCode'; + }; + return $_SESSION['captcha_name']; +} + + +function phpfmg_check_recaptcha(){ + $errmsg = ERR_CAPTCHA; + if( isset($_POST['g-recaptcha-response']) ){ + $get = 'https://www.google.com/recaptcha/api/siteverify?secret=' . phpfmg_reCAPTCHA_key('secret_key'). '&response=' . $_POST['g-recaptcha-response']; + $response = file_get_contents($get); + echo $response; + $success = false; + if( function_exists('json_decode') ){ + $json = json_decode( $response, true ); + var_dump($json); + $success = $json['success'] === true; + }else{ + $success = preg_match( '/success[\"\']*\\:\\s*(true|1|y)/i', $response ); + }; + return $success ? '' : $errmsg; + } + return $errmsg; +} + +function phpfmg_check_captcha(){ + $errmsg = ''; + if( phpfmg_is_reCAPTCHA() ){ + $errmsg = phpfmg_check_recaptcha(); + }else{ + + $name = phpfmg_captcha_name(); + if( (defined('PHPFMG_SIMPLE_CAPTCHA_NAME') && PHPFMG_SIMPLE_CAPTCHA_NAME != '') && + ( !isset( $_POST[$name] ) || // maybe sutmited by spam bot + strtoupper($_POST[$name]) != strtoupper($_SESSION[$name]) // or user didn't type correct code + ) + ){ + $errmsg = ERR_CAPTCHA ; + }; + + }; + + return $errmsg ; +} + +function phpfmg_reCAPTCHA_key( $type ){ + $isSitekey = $type == 'site_key'; + // this keys are for formmail-maker.com domain only + $phpfmgSiteKey = '6LcQuv8SAAAAAKSvNHfF5gQuW9WIpcualeEYllCn'; + $phpfmgSecretKey = '6LcQuv8SAAAAABczBmLx85TQfdlkeMkjhz4Hzv5D'; + if( $isSitekey ){ + return phpfmg_is_mysite() ? $phpfmgSiteKey : RECAP_SITE_KEY; + }else{ + return phpfmg_is_mysite() ? $phpfmgSecretKey : RECAP_SECRET_KEY; + } + +} + + +function phpfmg_is_reCAPTCHA(){ + return (defined('RECAP_SITE_KEY') && '' != RECAP_SITE_KEY && defined('RECAP_SECRET_KEY') && '' != RECAP_SECRET_KEY) || (phpfmg_is_mysite() && defined('RECAP_SITE_KEY') ) ; +} + +function phpfmg_get_reCAPTCHA_html(){ + return + " +
"; + +} + +function phpfmg_show_captcha(){ + if( phpfmg_is_reCAPTCHA() ){ + echo phpfmg_get_reCAPTCHA_html(); + return ; + }; + $url = PHPFMG_ADMIN_URL . '?mod=captcha&func=get&tid=' ; + $onclick= "onclick=\"document.getElementById('phpfmg_captcha_image').src='{$url}'+Math.random();return false;\" " ; + echo "\"Click\n"; + echo "Reload Verification Image
\n"; + echo "\n"; +} + + + +function phpfmg_hsc($field, $default = false){ + echo isset($_POST[ $field ]) + ? HtmlSpecialChars( $_POST[ $field ] ) + : $default; +} + +function phpfmg_dropdown( $name, $options, $showInputbox = false, $isMultiple = false, $extra = '', $isReturn = false, $class = 'text_select' ){ + //$showInputbox = true; + $displayLast = 'none' ; + $onchange = $showInputbox ? " onchange=\"toggleOtherInputBox('{$name}','select','{$name}');\" " : "" ; + $sMultiple = $isMultiple ? 'multiple="multiple"' : '' ; + $other = "{$name}_other" ; + + $dropdown = array(); + $list = explode( '|', $options ); + $dropdown[] = "\n"; + + if( $showInputbox ){ + $dropdown[] = "" ; + $dropdown[] = "
" ; + }; + + $s = join("\t\n",$dropdown); + + if( $isReturn ) + return $s; + else + echo $s ; +} + + +function phpfmg_date_dropdown( $cfgDate, $showSep = true ){ + $sep = $showSep ? $cfgDate['separator'] . " " : ""; + $field_name = $cfgDate['field_name']; + if( !isset($cfgDate['yyyy']) ){ + $startYear = $cfgDate['startYear']; + $endYear = $cfgDate['endYear']; + $year = range( $startYear, $endYear ); + $cfgDate['yyyy'] = $cfgDate['yearPrompt'] . '=,|' . join("|",$year); + }; + + switch( $cfgDate['format'] ){ + case 'mm/dd/yyyy' : + phpfmg_dropdown( $field_name.'_month', $cfgDate['month'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_day', $cfgDate['day'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_yyyy', $cfgDate['yyyy'], false, false, '', false, '' ); + break; + case 'dd/mm/yyyy' : + phpfmg_dropdown( $field_name.'_day', $cfgDate['day'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_month', $cfgDate['month'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_yyyy', $cfgDate['yyyy'], false, false, '', false, '' ); + break; + case 'yyyy/mm/dd' : + phpfmg_dropdown( $field_name.'_yyyy', $cfgDate['yyyy'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_month', $cfgDate['month'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_day', $cfgDate['day'], false, false, '', false, '' ); + break; + case 'mm/yyyy' : + phpfmg_dropdown( $field_name.'_month', $cfgDate['month'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_yyyy', $cfgDate['yyyy'], false, false, '', false, '' ); + break; + case 'yyyy/mm' : + phpfmg_dropdown( $field_name.'_yyyy', $cfgDate['yyyy'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_month', $cfgDate['month'], false, false, '', false, '' ); + break; + case 'mm/dd' : + phpfmg_dropdown( $field_name.'_month', $cfgDate['month'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_day', $cfgDate['day'], false, false, '', false, '' ); + break; + case 'dd/mm' : + phpfmg_dropdown( $field_name.'_day', $cfgDate['day'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_month', $cfgDate['month'], false, false, '', false, '' ); + break; + }; + echo "\n\n"; + echo "\n"; + +} + + +function phpfmg_date_dropdown_require( $field_name ){ + if( !isset($_POST) ) + return ; + + $month = $_POST[$field_name.'_month']; + $day = $_POST[$field_name.'_day']; + $yyyy = $_POST[$field_name.'_yyyy']; + $format = $_POST[$field_name.'_format']; + $sep = isset($_POST[$field_name.'_separator']) ? $_POST[$field_name.'_separator'] : '/'; + + // make up $_POST[$field_name] value + $_POST[$field_name] = ''; + switch( $format ){ + case 'mm/dd/yyyy' : + if( !empty($month) && !empty($day) && !empty($yyyy) ) + $_POST[$field_name] = $month . $sep . $day . $sep . $yyyy; + break; + case 'dd/mm/yyyy' : + if( !empty($month) && !empty($day) && !empty($yyyy) ) + $_POST[$field_name] = $day . $sep . $month . $sep . $yyyy; + break; + case 'yyyy/mm/dd' : + if( !empty($month) && !empty($day) && !empty($yyyy) ) + $_POST[$field_name] = $yyyy . $sep . $month . $sep . $day; + break; + case 'mm/yyyy' : + if( !empty($month) && !empty($yyyy) ) + $_POST[$field_name] = $month . $sep . $yyyy; + break; + case 'yyyy/mm' : + if( !empty($month) && !empty($yyyy) ) + $_POST[$field_name] = $month . $sep . $yyyy; + break; + case 'mm/dd' : + if( !empty($month) && !empty($day) ) + $_POST[$field_name] = $month . $sep . $day; + break; + case 'dd/mm' : + if( !empty($month) && !empty($day) ) + $_POST[$field_name] = $day . $sep . $month; + break; + }; + +} + +function phpfmg_time_dropdown( $cfgTime ){ + $field_name = $cfgTime['field_name']; + $sep =": "; + switch( $cfgTime['hourOpt'] ){ + case 'h12' : + phpfmg_dropdown( $field_name.'_hour', $cfgTime['hour'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_minute', $cfgTime['minute'], false, false, '', false, '' ); + phpfmg_dropdown( $field_name.'_amfm', $cfgTime['amfm'], false, false, '', false, '' ); + break; + case 'h24' : + phpfmg_dropdown( $field_name.'_hour', $cfgTime['hour'], false, false, '', false, '' ); + echo $sep; + phpfmg_dropdown( $field_name.'_minute', $cfgTime['minute'], false, false, '', false, '' ); + break; + }; + echo "\n\n"; +} + + +function phpfmg_time_dropdown_require( $field_name ){ + if( !isset($_POST) ) + return ; + + $hour = $_POST[$field_name.'_hour']; + $minute = $_POST[$field_name.'_minute']; + $amfm = $_POST[$field_name.'_amfm']; + $format = $_POST[$field_name.'_format']; + $sep = ':'; + + // make up $_POST[$field_name] value + $_POST[$field_name] = ""; + switch( $format ){ + case 'h12' : + if( !empty($hour) && !empty($minute) && !empty($amfm) ) + $_POST[$field_name] = $hour . $sep . $minute . ' ' . $amfm; + break; + case 'h24' : + if( !empty($hour) && !empty($minute) ) + $_POST[$field_name] = $hour . $sep . $minute; + break; + }; + +} + + + +function phpfmg_dependent_dropdown( $field_name ){ + $field = phpfmg_dependent_dropdown_get_field( $field_name ); + $dd = new DependantDropdown(); + $dd->parseFmgField($field); + $html = $dd->getHtml(); + echo $html; +} + +function phpfmg_dependent_dropdown_dynamic_require( $field_name ){ + $field = phpfmg_dependent_dropdown_get_field( $field_name ); + $dd = new DependantDropdown(); + $dd->parseFmgField($field); + $dd->dynamicRequired(); +} + +function phpfmg_dependent_dropdown_get_field( $field_name ){ + if( !isset($_SESSION[PHPFMG_ID]) ){ + $_SESSION[PHPFMG_ID] = array(); + }; + if( !isset($_SESSION[PHPFMG_ID]['DD_DATA_' . $field_name]) ){ + $base64 = phpfmg_dependent_dropdown_data(); + $data = @unserialize( base64_decode($base64) ); + $_SESSION[PHPFMG_ID]['DD_DATA_' . $field_name] = $data; + }else{ + $data = $_SESSION[PHPFMG_ID]['DD_DATA_' . $field_name]; + }; + + if( !is_array($data) ){ + return ; + }; + + foreach( $data as $field ){ + if( $field['name'] == $field_name ){ + return $field; + }; + }; +} + + +# ------------------------------------------------------ +class DependantDropdown +{ + var $data = ''; + var $sheet = array(); + var $fields = array(); + var $fieldInfo = array( 'label', 'instruction', 'required', 'prompt' ); // describe field information from the first N rows of data + var $prefix = 'dd'; // in case there is no name for dropdown, it will name the dropdown like dd_0, dd_1, ... + + var $fmgField = false; + var $newliner = "" ; // replace \r\n with $newliner ; + var $newtaber = "" ; // replace \t with $newtaber ; + + function __construct(){ + } + + function DependantDropdown(){ + } + + + function lookupFieldColumn( $field, $column, $lookup, $contentType='text/plain', $charset='utf-8' ){ + $this->parseFmgField( $field ); + $this->nocache_headers( $contentType, $charset ); + return join( "\n", $this->getColumn( $column, $lookup ) ); + } + + function parseFmgField( $field ){ + if( !isset($_SESSION[PHPFMG_ID]) ){ + $_SESSION[PHPFMG_ID] = array(); + }; + $this->fmgField = $field; + $value = $this->newline_back($field['value']); + $this->data = explode("\r\n",$value); + if( !isset($_SESSION[PHPFMG_ID][ "DD_".$field['name'] ]) ){ + $this->parseData($field); + $_SESSION[PHPFMG_ID][ "DD_".$field['name'] ] = $this->fields; + }else{ + $this->fields = $_SESSION[PHPFMG_ID][ "DD_".$field['name'] ]; + }; + $this->makeupFieldsName(); + } + + function newline_back( $str = "" ){ + return str_replace( array($this->newtaber, $this->newliner), array("\t","\r\n"), $str ); + } + + function nocache_headers($contentType='text/plain', $charset='utf-8'){ + header("Expires: Mon, 01 Jan 1970 00:00:01 GMT"); + header("Cache-Control: max-age=0, no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + header( "Content-Type: {$contentType}; charset={$charset}" ); + } + + + function setData( $s ){ + $this->data = $s ; + } + + function setPrefix( $s ){ + $this->prefix = $s; + } + + function parseData(){ + $tab = chr(0x09); + $nFieldInfoRows = count( $this->fieldInfo ); + for( $i = 0, $n = count($this->data); $i < $n; $i ++ ){ + $line = str_replace('"', '', $this->data[$i] ); + //$line = stripslashes( $line ); + $cols = explode( $tab, $line ); + + if( is_array($cols) && count($cols) > 1 ){ + + if( $i < $nFieldInfoRows ){ + $trims = array(); + foreach( $cols as $col ){ + $trims[] = trim($col); + }; + $this->fields[ $this->fieldInfo[$i] ] = $trims; + } + else + $this->fields['data'][] = $cols; + + }; // if + + //if ( $i > 1000 ) break; + }; // for + + } + + // $quickTest : to see whether a column contains data + function getColumn( $n, $lookup = array(), $quickTest = false ){ + $count = count($lookup); + if( $n > 0 && empty($count) ){ + return array(); // can not get column without search query + }; + + $col = array(); + $lastValue = $lookup[ $count - 1 ]; + $flatLookup = join( '|', $lookup ); + // when using ajax GET method, use utf8 to encoude the lookup query. otherwise, some special chars like France characters might not work + if( !$this->isPost() ){ + $lastValue = utf8_encode( $lastValue ); + $flatLookup = utf8_encode( $flatLookup ); + }; + + foreach( $this->fields['data'] as $r ){ + + if( !isset($r[$n]) ) + continue; + + $value = trim($r[$n]); + if( $value == '' ) + continue; + + if( $n == 0 ){ + $col[] = $value; + + }else{ + + //if( trim($r[$n-1]) == $lastValue ){ // quick check to improve performance + if( $r[$n-1] == $lastValue ){ // quick check the last value to improve performance + $leftCols = array_slice( $r, 0, $n ); + $flatLeftValues = join( '|', $leftCols ); + if( $flatLeftValues == $flatLookup ){ // show value only by lookuping by joining all its parents' values + $col[] = $value; + }; + }; // if + + }; // if $n == 0 + + if( $quickTest && count($col) > 0 ) break; + + }; // foreach + + return array_unique($col); + } + + function getColumnOptions( $n, $lookup = array(), $default = '' ){ + $opts = array(); + foreach( $this->getColumn($n, $lookup) as $v ){ + $selected = $default == $v ? 'selected' : '' ; + $opts[] = ""; + }; + return join("\n",$opts); + } + + function hsc($s){ + return str_replace ( array ( '&', '"', "'", '<', '>' ), array ( '&' , '"', ''' , '<' , '>' ), $s ); + } + + function isPost(){ + return isset($_POST[ $this->fields['name'][0] ]); + } + + function getHtml(){ + $html = array(); + + $field_name = $this->fmgField['name']; + $this->prefix = $field_name; + $count = count($this->fields['label']); + + // prepare for getting column options after form submitted + $lookup = array(); + $isPost = $this->isPost(); // isset($_POST[ $this->fields['name'][0] ]); + if( $isPost ){ + for( $i = 0; $i < $count; $i++ ){ + $label = $this->fields['label'][$i]; + if( empty($label) ) + continue; + + $lookup[] = $_POST[ $this->fields['name'][$i] ]; + }; + }; + + for( $i = 0; $i < $count; $i++ ){ + $label = stripslashes( $this->fields['label'][$i] ); + if( empty($label) ) + continue; + + $name = $this->fields['name'][$i]; + $instruction = $this->fields['instruction'][$i]; + $prompt = $this->fields['prompt'][$i]; + $required = $this->fields['required'][$i]; + $promptOption = empty($prompt) ? "" : ""; + if( $isPost ) + $options = $this->getColumnOptions( $i, array_slice($lookup,0,$i), $_POST[$name] ); + else + $options = $this->getColumnOptions( $i, array(), '' ); + + $select = ""; + $sRequired = "" ; +$li = " +
  • +
    + {$sRequired} +
    +
    + {$select} +
    {$instruction}
    +
    +
  • +"; + $html[] = $li; + }; + + echo join("\n\n",$html); + + } + + + function dynamicRequired(){ + if( !isset($_POST) ){ + return ; + }; + + $field_name = $this->fmgField['name']; + $this->prefix = $field_name; + $count = count($this->fields['label']); + + $lookup = array(); + $isPost = isset($_POST[ $this->fields['name'][0] ]); + if( $isPost ){ + for( $i = 0; $i < $count; $i++ ){ + $label = $this->fields['label'][$i]; + if( empty($label) ) + continue; + + $lookup[] = $_POST[ $this->fields['name'][$i] ]; + }; + }; + + for( $i = 0; $i < $count; $i++ ){ + $label = $this->fields['label'][$i]; + if( empty($label) ) + continue; + + $name = $this->fields['name'][$i]; + $required = $this->fields['required'][$i]; + if( strtolower($required) == 'required' ){ + $rows = $this->getColumn( $i, array_slice($lookup,0,$i), true ); + if( empty($rows) ) { + $GLOBALS['form_mail'][ $name ]['required'] = '' ; // + }; + }else{ + $GLOBALS['form_mail'][ $name ]['required'] = '' ; + }; + }; + + } + + + function getFormMailArrayCode(){ + $code = array(); + for( $i = 0, $n = count($this->fields['label']); $i < $n; $i++ ){ + $label = $this->fields['label'][$i]; + if( empty($label) ) + continue; + $name = $this->fields['name'][$i]; + $instruction = $this->fields['instruction'][$i]; + $prompt = $this->fields['prompt'][$i]; + $required = $this->fields['required'][$i]; + $code[] = "\$GLOBALS['form_mail']['{$name}'] = array( \"name\" => \"$name\", \"text\" => \"" . addslashes( $label ) . "\", \"type\" => \"select\", \"instruction\" => \"$instruction\", \"required\" => \"$required\" ) ;" ; + }; + return join("\n",$code); + } + + function makeupFieldsName($default='field_99'){ + $field_name = isset($this->fmgField['name']) ? $this->fmgField['name'] : $default; + $this->prefix = $field_name; + for( $i = 0, $n = count($this->fields['label']); $i < $n; $i++ ){ + $this->fields['name'][$i] = $this->prefix . '_' . $i; + }; + } + +} + + + +function phpfmg_parse_option( $opt ){ + $opt = $opt; + $a = array( + 'text' => $opt, + 'value' => $opt, + 'default' => false, + ); + $pos = strrpos( $opt, '=' ); + if( false !== $pos ){ + $a['text'] = substr($opt,0,$pos); + $part = substr($opt,$pos+1); + $nv = strrpos( $part, ',' ); + if( false !== $nv ){ + $a['value'] = substr($part,0,$nv); + $a['default'] = 'default' == strtolower(substr($part,$nv+1)); + }else{ + $a['value'] = $part; + }; + }; + $a['text'] = trim($a['text']); + $a['value'] = trim($a['value']); + return $a ; +} + + + +function phpfmg_field_value( $name ){ + $value = "" ; + if( isset($GLOBALS[$name."_value"]) ) + return $GLOBALS[$name."_value"] ; + + $field = $GLOBALS['form_mail'][$name]; + $checkOther = isset( $_POST[$name.'_other_check'] ) && 1 == $_POST[$name.'_other_check'] ; + $otherInputValue = $checkOther ? $_POST[$name.'_other'] : '' ; + + switch( $field['type'] ){ + case 'select' : + if( $checkOther && $otherInputValue == "" ){ + return $value; + }; + + if( is_array($_POST[$name]) ){ + //array_pop( $_POST[$name] ); // pop the last "other" element + $value = join(PHPFMG_LNCR,$_POST[$name]) . PHPFMG_LNCR. $otherInputValue ; + $value = str_replace( PHPFMG_LNCR . "other", "", $value ); + }else{ + $value = $checkOther ? $otherInputValue : $_POST[ $name ]; + }; + break; + + case 'radio' : + if( $checkOther ){ + $value = $otherInputValue == '' ? '' : $otherInputValue; + }else{ + $value = $_POST[ $name ]; + }; + break; + + case 'checkbox' : + if( $checkOther && $otherInputValue == "" ){ + return $value; + }; + + $length = isset($_POST[$name.'_length']) ? $_POST[$name.'_length'] : 100; + $values = array(); + for( $i = 1; $i <= $length; $i ++){ + $newName = 'Checkbox' . ($i<10 ? '0' .$i : $i ) . "_" . $name; + if( $_POST[ $newName ] != "" && $_POST[ $newName ] != 'other' ) + $values[] = $_POST[ $newName ]; + }; + $value = ( empty($values) ? "" : join( PHPFMG_LNCR, $values ) ) . ( $otherInputValue != "" ? PHPFMG_LNCR . $otherInputValue : "" ); + break; + + default: + $value = $_POST[ $name ]; + break; + }; + $value = phpfmg_stripTags( $value ); + $GLOBALS[$name."_value"] = $value ; + return $value; +} + +function phpfmg_stripTags($str){ + $allowable_tags = "