diff --git a/contact.admin.php b/contact.admin.php new file mode 100644 index 0000000..1a3eaa4 --- /dev/null +++ b/contact.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( + 'F29A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nGNYhQEaGAYTpIn7QkMZQxhCGVqRxQIaWFsZHR2mOqCIiTS6NgQEBKCIMQDFAh1EkNwXGrVq6crMyKxpSO4DqpvCEAJXBxMLYGgIDA1BEWN0YGxAV8fawOjoiCYmGuoQyogiNlDhR0WIxX0A4WHMkXyw53UAAAAASUVORK5CYII=', + '80EE' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAWElEQVR4nGNYhQEaGAYTpIn7WAMYAlhDHUMDkMREpjCGsDYwOiCrC2hlbUUXE5ki0uiKEAM7aWnUtJWpoStDs5Dch6YOah42MWx2YLoFm5sHKvyoCLG4DwB5nMk7XGkkZgAAAABJRU5ErkJggg==', + 'B46A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdElEQVR4nGNYhQEaGAYTpIn7QgMYWhlCgRhJLGAKw1RGR4epDshiQFWsDQ4BASjqGF1ZGxgdRJDcFxq1dOnSqSuzpiG5L2CKSCuroyNMHdQ80VDXhsDQEFQ7WlkbAlHVTWFoZUTTC3EzI4rYQIUfFSEW9wEAr5nMfCHD8SgAAAAASUVORK5CYII=', + '0413' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nGNYhQEaGAYTpIn7GB0YWhmmMIQ6IImxBjBMZQhhdAhAEhMBqmEMAdJIYgGtjK5AvQ0BSO6LWrp06appq5ZmIbkvoFWkFUkdVEw01GEKqnlAO8DqRFDdAhRDdQvIzYyhDihuHqjwoyLE4j4ADQbLbmTNXLkAAAAASUVORK5CYII=', + '0F6A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7GB1EQx1CGVqRxVgDRBoYHR2mOiCJiUwRaWBtcAgIQBILaAWJMTqIILkvaunUsKVTV2ZNQ3IfWJ2jI0wdkt7A0BAMOwJR1EHcgqoXbGMoI4rYQIUfFSEW9wEAquPK0uIwXQgAAAAASUVORK5CYII=', + 'BD0D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXElEQVR4nGNYhQEaGAYTpIn7QgNEQximMIY6IIkFTBFpZQhldAhAFmsVaXR0dHQQQVXX6NoQCBMDOyk0atrK1FWRWdOQ3IemDm4eNjEsdmC4BZubByr8qAixuA8AwMvNc5TosDQAAAAASUVORK5CYII=', + '68BA' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7WAMYQ1hDGVqRxUSmsLayNjpMdUASC2gRaXRtCAgIQBZrAKlzdBBBcl9k1MqwpaErs6YhuS9kCoo6iN5WkHmBoSGYYijqRLDohbiZEUVsoMKPihCL+wD/Lsy5IxWk1AAAAABJRU5ErkJggg==', + 'D4D3' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAY0lEQVR4nGNYhQEaGAYTpIn7QgMYWllDGUIdkMQCpjBMZW10dAhAFmtlCGVtCGgQQRFjdAWJBSC5L2opEADJLCT3BbSKtCKpg4qJhrpimMfQimHHFKAYmluwuXmgwo+KEIv7AMmbzx9SYeT/AAAAAElFTkSuQmCC', + '854D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7WANEQxkaHUMdkMREpog0MLQ6OgQgiQW0AsWmOjqIoKoLYQiEi4GdtDRq6tKVmZlZ05DcJzKFodG1EVVvQCtQLDQQTUyk0aER3Q5WoEpUt7AGMIagu3mgwo+KEIv7AJAIzI6R5ixaAAAAAElFTkSuQmCC', + '51F9' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QkMYAlhDA6Y6IIkFNDAGsDYwBASgiLECxRgdRJDEAgMYkMXATgqbtipqaeiqqDBk97WC1DFMRdYLFWtAFguAiKHYITKFAcMtQJeEgsxDdvNAhR8VIRb3AQCTZMksXTMt4AAAAABJRU5ErkJggg==', + '7B92' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdElEQVR4nGNYhQEaGAYTpIn7QkNFQxhCGaY6IIu2irQyOjoEBKCKNbo2BDqIIItNEWllbQhoEEF2X9TUsJWZUauikNzH6CDSyhAS0IhsB2uDCJAf0IrsFhGgmGNDwBRkMaDpYLegioHczBgaMgjCj4oQi/sAaLTMcMk0b84AAAAASUVORK5CYII=', + '574E' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QkNEQx0aHUMDkMSA7EaHVkcHBnSxqahigQEMrQyBcDGwk8KmrZq2MjMzNAvZfa0MAayNqHoZWhkdWEMDUe1oZQXagqpOZIoIhhhrAFgMxc0DFX5UhFjcBwAoyssY9VovqwAAAABJRU5ErkJggg==', + '490D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpI37pjCGAHGoA7JYCGsrQyijQwCSGGOISKOjo6ODCJIY6xSRRteGQJgY2EnTpi1dmroqMmsakvsCpjAGIqkDw9BQhkZ0MYYpLBh2MEzBdAtWNw9U+FEPYnEfAK7EyxVLCx+mAAAAAElFTkSuQmCC', + 'D791' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7QgNEQx1CGVqRxQKmMDQ6OjpMRRFrZWh0bQgIRRNrZQWRSO6LWrpq2spMIInkPqCKAIaQAFQ7WhkdGBrQxVgbGNHFpog0MDo6oIiFBog0MIQyhAYMgvCjIsTiPgA4hM25VMJ7sgAAAABJRU5ErkJggg==', + '31A1' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYUlEQVR4nGNYhQEaGAYTpIn7RAMYAhimMLQiiwVMYQxgCGWYiqKylTWA0dEhFEVsCkMAa0MATC/YSSujVkUtBSFk96Gqg5oHFAvFIoamLgCLXlGgTqBYaMAgCD8qQizuAwCOfcpeId7qcAAAAABJRU5ErkJggg==', + 'FEDE' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAS0lEQVR4nGNYhQEaGAYTpIn7QkNFQ1lDGUMDkMQCGkQaWBsdHRjQxRoC8YmBnRQaNTVs6arI0Cwk9xGhF78Yhlsw3TxQ4UdFiMV9AKsKy9JN9QjrAAAAAElFTkSuQmCC', + '3F73' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7RANEQ11DA0IdkMQCpogAyUCHAGSVrSCxgAYRZDGQukaHhgAk962Mmhq2aumqpVnI7gOpm8LQgGFeAAOqeUAxRgdUMZBbWIGiyHpFA0BiDChuHqjwoyLE4j4AKqbMtgG9VzwAAAAASUVORK5CYII=', + 'B182' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpIn7QgMYAhhCGaY6IIkFTGEMYHR0CAhAFmtlDWBtCHQQQVHHAFLXIILkvtCoVVGrQlcBCYT7oOoaUexoZQCaByQxxaYwYNoRgOpm1lCGUMbQkEEQflSEWNwHABXny0eZ4YibAAAAAElFTkSuQmCC', + '6796' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdElEQVR4nGNYhQEaGAYTpIn7WANEQx1CGaY6IImJTGFodHR0CAhAEgtoYWh0bQh0EEAWa2BoZQWKIbsvMmrVtJWZkalZSO4LmcIQwBASiGpeKyNQX6CDCIoYawMjmpjIFJEGRjS3sAYAVaC5eaDCj4oQi/sACG3L+wx5ue0AAAAASUVORK5CYII=', + '811F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXElEQVR4nGNYhQEaGAYTpIn7WAMYAhimMIaGIImJTGEMYAhhdEBWF9DKGsCIJiYyBawXJgZ20tKoVVGrpq0MzUJyH5o6qHnEiWHTyxrAGsoY6ogiNlDhR0WIxX0AxR/HCPQ88Y0AAAAASUVORK5CYII=', + '6B8A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7WANEQxhCGVqRxUSmiLQyOjpMdUASC2gRaXRtCAgIQBZrAKlzdBBBcl9k1NSwVaErs6YhuS9kCoo6iN5WkHmBoSGYYijqRLDohbiZEUVsoMKPihCL+wAF1Mv0tdDYEgAAAABJRU5ErkJggg==', + 'C620' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdUlEQVR4nGNYhQEaGAYTpIn7WEMYQxhCGVqRxURaWVsZHR2mOiCJBTSKNLI2BAQEIIs1iADJQAcRJPdFrZoWtmplZtY0JPcFNIi2MrQywtTB9DY6TEETA9rhEMCAYgfYLQ4MKG4BuZk1NADFzQMVflSEWNwHAMP9y9uPvArYAAAAAElFTkSuQmCC', + 'D385' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZElEQVR4nGNYhQEaGAYTpIn7QgNYQxhCGUMDkMQCpoi0Mjo6OiCrC2hlaHRtCEQXA6lzdUByX9TSVWGrQldGRSG5D6LOoUEEw7wALGKBDiIYbnEIQHYfxM0MUx0GQfhREWJxHwDM8MzjPUmFtAAAAABJRU5ErkJggg==', + '187E' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpIn7GB0YQ1hDA0MDkMRYHVhbGRoCHZDViTqINDqgiTGC1DU6wsTATlqZtTJs1dKVoVlI7gOrm8KIphdoXgCmmKMDuhhrK2sDqphoCNDNDYwobh6o8KMixOI+ADZOxzvRVDR6AAAAAElFTkSuQmCC', + '14E7' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaElEQVR4nGNYhQEaGAYTpIn7GB0YWllDHUNDkMRYHRimsgJpESQxUQeGUHQxRgdGV5BYAJL7VmYtXbo0FEghuY/RQaQVqK4V1V7RUNcGhikYbmlgCMAUA5LIbgkBuxlFbKDCj4oQi/sA7ZnH0+jlxKYAAAAASUVORK5CYII=', + 'D865' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7QgMYQxhCGUMDkMQCprC2Mjo6OiCrC2gVaXRtQBdjbWVtYHR1QHJf1NKVYUunroyKQnIfWJ2jQ4MIhnkBWMQCHUQw3OIQgOw+iJsZpjoMgvCjIsTiPgAwAM00MlE58gAAAABJRU5ErkJggg==', + 'F8E8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAUUlEQVR4nGNYhQEaGAYTpIn7QkMZQ1hDHaY6IIkFNLC2sjYwBASgiIk0ujYwOojgVgd2UmjUyrCloaumZiG5j3jzCNoBFcN080CFHxUhFvcBAD48zRfy81C7AAAAAElFTkSuQmCC', + 'CA3A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAc0lEQVR4nGNYhQEaGAYTpIn7WEMYAhhDGVqRxURaGUNYGx2mOiCJBTSyAtUEBAQgizWINDo0OjqIILkvatW0lVlTV2ZNQ3IfmjqomGioQ0NgaAiKHUB1DYEo6kRaRRpd0fSyhog0OoYyoogNVPhREWJxHwDYzs2lyy20iwAAAABJRU5ErkJggg==', + '2329' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAd0lEQVR4nGNYhQEaGAYTpIn7WANYQxhCGaY6IImJTBFpZXR0CAhAEgtoZWh0bQh0EEHW3QqECDGIm6atClu1MisqDNl9AWCVU5H1MjowNDpMAdqF7JYGoFgAA4odIg1AtzgwoLglNJQ1hDU0AMXNAxV+VIRY3AcAcW3KyQgjqfMAAAAASUVORK5CYII=', + 'CF1F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXklEQVR4nGNYhQEaGAYTpIn7WENEQx2mMIaGIImJtIo0MIQwOiCrC2gUaWBEF2sAqpsCFwM7KWrV1LBV01aGZiG5D00dbrFGTDGwW9DEWEOAbgl1RBEbqPCjIsTiPgD2u8mLBFJTfQAAAABJRU5ErkJggg==', + '07C8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAc0lEQVR4nGNYhQEaGAYTpIn7GB1EQx1CHaY6IImxBjA0OjoEBAQgiYlMYWh0bRB0EEESC2hlaGVtYICpAzspaumqaUtXrZqaheQ+oLoAJHVQMUYHVqDtIih2sDawotnBGiACVIXqFrAuNDcPVPhREWJxHwCh/8uavOaBBQAAAABJRU5ErkJggg==', + 'B0AB' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QgMYAhimMIY6IIkFTGEMYQhldAhAFmtlbWV0dHQQQVEn0ujaEAhTB3ZSaNS0lamrIkOzkNyHpg5qHlAsNBDVPKAdrA1oYkC3sKLpBbkZKIbi5oEKPypCLO4DAD4xzUOE3JRsAAAAAElFTkSuQmCC', + '6087' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7WAMYAhhCGUNDkMREpjCGMDo6NIggiQW0sLayNgSgijWINDoC1QUguS8yatrKrNBVK7OQ3BcyBayuFdnegFaRRteGgCmoYmA7Ahgw3OLogMXNKGIDFX5UhFjcBwCUOsuEYex17wAAAABJRU5ErkJggg==', + 'FE4F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAWElEQVR4nGNYhQEaGAYTpIn7QkNFQxkaHUNDkMQCGkQaGFodHRjQxaZiEQuEi4GdFBo1NWxlZmZoFpL7QOpYGzH1soYGYpqHRR2mGNjNKGIDFX5UhFjcBwBj0ct6alE+fAAAAABJRU5ErkJggg==', + 'FB52' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7QkNFQ1hDHaY6IIkFNIi0sjYwBASgijW6NjA6iKCrm8rQIILkvtCoqWFLM7NWRSG5D6QOSDai2QHkB7QyYNgRMAVNrJXR0SEAVUw0hCGUMTRkEIQfFSEW9wEAa+TN/Kxz5qoAAAAASUVORK5CYII=', + '9E9A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7WANEQxlCGVqRxUSmiDQwOjpMdUASC2gVaWBtCAgIwBALdBBBct+0qVPDVmZGZk1Dch+rK1BFCFwdBLaCeIGhIUhiAkAxxgZUdRC3OKKIQdzMiGreAIUfFSEW9wEAh4nKni0dVVUAAAAASUVORK5CYII=', + 'DEB6' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAV0lEQVR4nGNYhQEaGAYTpIn7QgNEQ1lDGaY6IIkFTBFpYG10CAhAFmsFijUEOgigizU6OiC7L2rp1LCloStTs5DcB1WH1TwRQmJY3ILNzQMVflSEWNwHADErzdROdvXrAAAAAElFTkSuQmCC', + '3137' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7RAMYAhhDGUNDkMQCpjAGsDY6NIggq2xlDQDKoIpNYQhgAKoLQHLfyqhVUaumrlqZhew+iLpWFJtbGUDmTcEiFsCA4hYGoFscHVDdzAp0MSOK2ECFHxUhFvcBAPdeyi4ZP7jqAAAAAElFTkSuQmCC', + 'A059' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdklEQVR4nGNYhQEaGAYTpIn7GB0YAlhDHaY6IImxBjCGsDYwBAQgiYlMYW1lBaoWQRILaBVpdJ0KFwM7KWrptJWpmVlRYUjuA6lzaAiYiqw3NBQs1oBqHsiOADQ7GEMYHR1Q3BLQyhDAEMqA4uaBCj8qQizuAwCWCcwO1X6SGQAAAABJRU5ErkJggg==', + 'DA89' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7QgMYAhhCGaY6IIkFTGEMYXR0CAhAFmtlbWVtCHQQQRETaXR0dISJgZ0UtXTayqzQVVFhSO6DqHOYiqpXNNS1IaAB3TygGKodU8B6UdwSGiDS6IDm5oEKPypCLO4DAELXzjUb4LxeAAAAAElFTkSuQmCC', + '145A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAc0lEQVR4nGNYhQEaGAYTpIn7GB0YWllDHVqRxVgdGKayNjBMdUASE3VgCAWKBQSg6GV0ZZ3K6CCC5L6VWUuXLs3MzJqG5D6gCqD5gTB1UDHRUIeGwNAQdLdgqGNoZXR0RBETDWFoZQhlRBEbqPCjIsTiPgAUqsgGVvOZ5wAAAABJRU5ErkJggg==', + 'B140' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpIn7QgMYAhgaHVqRxQKmMAYwtDpMdUAWa2UNYJjqEBCAog6oN9DRQQTJfaFRq6JWZmZmTUNyH0gdayNcHdQ8oFhoIIYY0C2YdjSiuiUUqBPdzQMVflSEWNwHAEJBzET1uSmSAAAAAElFTkSuQmCC', + '8388' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAWElEQVR4nGNYhQEaGAYTpIn7WANYQxhCGaY6IImJTBFpZXR0CAhAEgtoZWh0bQh0EEFRx4CsDuykpVGrwlaFrpqaheQ+NHU4zcNuB6ZbsLl5oMKPihCL+wA3t8xGly2EVwAAAABJRU5ErkJggg==', + 'D2B0' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7QgMYQ1hDGVqRxQKmsLayNjpMdUAWaxVpdG0ICAhAEWNodG10dBBBcl/U0lVLl4auzJqG5D6guimsCHUwsQDWhkA0MUYHVnQ7prA2oLslNEA01BXNzQMVflSEWNwHAB1uzn5TG2tzAAAAAElFTkSuQmCC', + 'B091' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZElEQVR4nGNYhQEaGAYTpIn7QgMYAhhCGVqRxQKmMIYwOjpMRRFrZW1lbQgIRVUn0ugKlEF2X2jUtJWZmVFLkd0HUucQEoBqRytQrAFdjLWVEV0M4hYUMaibQwMGQfhREWJxHwBgDs00+56rEAAAAABJRU5ErkJggg==', + 'E65F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZElEQVR4nGNYhQEaGAYTpIn7QkMYQ1hDHUNDkMQCGlhbWRsYHRhQxEQasYg1sE6Fi4GdFBo1LWxpZmZoFpL7AhpEWxkaAjHMc8Ai5oohxtrK6OiIIgZyM0MoqlsGKvyoCLG4DwAsKsqF7rTx0QAAAABJRU5ErkJggg==', + '2CDF' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAY0lEQVR4nGNYhQEaGAYTpIn7WAMYQ1lDGUNDkMREprA2ujY6OiCrC2gVaXBtCEQRYwCKsSLEIG6aNm3V0lWRoVnI7gtAUQeGjA6YYqwNmHYAVWG4JTQU7GZUtwxQ+FERYnEfAFa0ypR0XieSAAAAAElFTkSuQmCC', + 'F24C' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaklEQVR4nGNYhQEaGAYTpIn7QkMZQxgaHaYGIIkFNLC2MrQ6BIigiIkAVTk6sKCIAXUGOjoguy80atXSlZmZWcjuA6qbwtoIVwcTC2ANDUQTY3RgaES3gxVkC5pbREMd0Nw8UOFHRYjFfQCQfM1JUgXJRAAAAABJRU5ErkJggg==', + '83A5' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7WANYQximMIYGIImJTBFpZQhldEBWF9DK0Ojo6IgiJjKFoZW1IdDVAcl9S6NWhS1dFRkVheQ+iLqABhE081xDsYg1BDqIoLkFqDcA2X0gNwPFpjoMgvCjIsTiPgAGIcx+c+wNSgAAAABJRU5ErkJggg==', + '6D82' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7WANEQxhCGaY6IImJTBFpZXR0CAhAEgtoEWl0bQh0EEEWaxBpdHR0aBBBcl9k1LSVWaGrVkUhuS9kClhdI7IdAa0g8wJaGTDFpjBgcQummxlDQwZB+FERYnEfALp7zWqE64TCAAAAAElFTkSuQmCC', + '8E0F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXUlEQVR4nGNYhQEaGAYTpIn7WANEQxmmMIaGIImJTBFpYAhldEBWF9Aq0sDo6IgiBlLH2hAIEwM7aWnU1LClqyJDs5Dch6YObh42MWx2oLsF6mYUsYEKPypCLO4DALOmyUwL4QKcAAAAAElFTkSuQmCC', + 'EDE6' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAU0lEQVR4nGNYhQEaGAYTpIn7QkNEQ1hDHaY6IIkFNIi0sjYwBASgijW6NjA6CGARQ3ZfaNS0lamhK1OzkNwHVYfVPBHCYhhuwebmgQo/KkIs7gMAb17NOLndlp8AAAAASUVORK5CYII=', + '1083' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAX0lEQVR4nGNYhQEaGAYTpIn7GB0YAhhCGUIdkMRYHRhDGB0dHQKQxEQdWFtZGwIaRFD0ijQClTUEILlvZda0lVmhq5ZmIbkPTR1czBXDPGx2YHFLCKabByr8qAixuA8AfoXJVB5lVNgAAAAASUVORK5CYII=', + '18F8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXklEQVR4nGNYhQEaGAYTpIn7GB0YQ1hDA6Y6IImxOrC2sjYwBAQgiYk6iDS6AlWLoOhFUQd20sqslWFLQ1dNzUJyHyMW8xixmkfQDohbQoBubmBAcfNAhR8VIRb3AQD3YMjVwccB2gAAAABJRU5ErkJggg==', + '39E7' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7RAMYQ1hDHUNDkMQCprC2sgJpEWSVrSKNruhiUyBiAUjuWxm1dGlq6KqVWcjum8IYCFTXimJzKwNI7xRUMRaQWACyGMQtjA5Y3IwiNlDhR0WIxX0AVLvLPNH3z8oAAAAASUVORK5CYII=', + '0F58' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7GB1EQ11DHaY6IImxBog0sDYwBAQgiYlMAYkxOoggiQW0AsWmwtWBnRS1dGrY0sysqVlI7gOpA5Io5kHEAlHMg9iBKgZyC6OjA4pesCtCGVDcPFDhR0WIxX0AhJ3LpHB1nNUAAAAASUVORK5CYII=', + '09BF' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7GB0YQ1hDGUNDkMRYA1hbWRsdHZDViUwRaXRtCEQRC2gFiiHUgZ0UtXTp0tTQlaFZSO4LaGUMdEUzL6CVAcM8kSksGGLY3AJ1M4rYQIUfFSEW9wEA0e/KLv366UIAAAAASUVORK5CYII=', + 'D1A4' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXklEQVR4nGNYhQEaGAYTpIn7QgMYAhimMDQEIIkFTGEMYAhlaEQRa2UNYHR0aEUVYwhgBaoOQHJf1FIwiopCch9EXaADht7QwNAQTPPQ3IIpFgrUiS42UOFHRYjFfQAx/M4JdITG7AAAAABJRU5ErkJggg==', + '3AB8' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZ0lEQVR4nGNYhQEaGAYTpIn7RAMYAlhDGaY6IIkFTGEMYW10CAhAVtnK2sraEOgggiw2RaTRFaEO7KSVUdNWpoaumpqF7D5UdVDzRENd0c1rBapDEwvAolc0ACiG5uaBCj8qQizuAwCuNc2vco1wjQAAAABJRU5ErkJggg==', + '2F5F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7WANEQ11DHUNDkMREpog0sDYwOiCrC2jFFGMAiU2Fi0HcNG1q2NLMzNAsZPcFiADJQBS9jA6YYqwNIDtQxUSAkNHREUUsNBSoNxTNLQMUflSEWNwHADmSyN30YwPwAAAAAElFTkSuQmCC', + '6649' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nGNYhQEaGAYTpIn7WAMYQxgaHaY6IImJTGFtZWh1CAhAEgtoEWlkmOroIIIs1gDkBcLFwE6KjJoWtjIzKyoMyX0hU0RbWYF2oOhtFWl0DQWbgCLm0OiAYgfYLY2obsHm5oEKPypCLO4DAEe/zTUUXAjJAAAAAElFTkSuQmCC', + '20B0' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaUlEQVR4nGNYhQEaGAYTpIn7WAMYAlhDGVqRxUSmMIawNjpMdUASC2hlbWVtCAgIQNbdKtLo2ujoIILsvmnTVqaGrsyahuy+ABR1YMjoABRrCEQRY23AtEOkAdMtoaGYbh6o8KMixOI+ANp0y/M65z1NAAAAAElFTkSuQmCC', + 'F86E' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAV0lEQVR4nGNYhQEaGAYTpIn7QkMZQxhCGUMDkMQCGlhbGR0dHRhQxEQaXRvQxVhbWRsYYWJgJ4VGrQxbOnVlaBaS+8DqsJoXSIQYNrdgunmgwo+KEIv7APuKy1HfG5BPAAAAAElFTkSuQmCC', + '8B84' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAW0lEQVR4nGNYhQEaGAYTpIn7WANEQxhCGRoCkMREpoi0Mjo6NCKLBbSKNLoCSSzqpgQguW9p1NSwVaGroqKQ3AdR5+iAaV5gaAimHdjcgiKGzc0DFX5UhFjcBwCuh85GN1cvcwAAAABJRU5ErkJggg==', + 'DE12' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZElEQVR4nGNYhQEaGAYTpIn7QgNEQxmmMEx1QBILmCLSwBDCEBCALNYq0sAYwugggiYG1NsgguS+qKVTw1ZNA9JI7oOqa3TA1NvKgCk2hQHdLVMYAtDdzBjqGBoyCMKPihCL+wBgmc0n6qWaWAAAAABJRU5ErkJggg==', + 'FC1F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAWUlEQVR4nGNYhQEaGAYTpIn7QkMZQxmmMIaGIIkFNLA2OoQwOjCgiIk0OGIRA+qFiYGdFBo1bdWqaStDs5Dch6YOr5gDhhjQLRhijEBXO6KIDVT4URFicR8AzI/LEVWHcP4AAAAASUVORK5CYII=', + 'C6A9' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdUlEQVR4nGNYhQEaGAYTpIn7WEMYQximMEx1QBITaWVtZQhlCAhAEgtoFGlkdHR0EEEWaxBpYG0IhImBnRS1alrY0lVRUWFI7gtoEG1lbQiYiqa30TUUZAKqHa4NASh2gNwC1IviFpCbQeYhu3mgwo+KEIv7AOMtzRjEtnl1AAAAAElFTkSuQmCC', + '2775' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAa0lEQVR4nGNYhQEaGAYTpIn7WANEQ11DA0MDkMREpjA0OjQEOiCrC2jFFGNoBcJGR1cHZPdNA8KlK6OikN0XAIRTgOYi6WV0YHQAiqKIsQIhSBxZTAQIWYEmILsvNBQsNtVhEIQfFSEW9wEA37rK64pnlHwAAAAASUVORK5CYII=', + '9831' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYklEQVR4nGNYhQEaGAYTpIn7WAMYQxhDGVqRxUSmsLayNjpMRRYLaBVpdGgICEUVY21laHSA6QU7adrUlWGrpq5aiuw+VlcUdRAIMQ9FTACLGNQtKGJQN4cGDILwoyLE4j4ABPLM3Rc723EAAAAASUVORK5CYII=', + 'EE05' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYElEQVR4nGNYhQEaGAYTpIn7QkNEQxmmMIYGIIkFNIg0MIQyOjCgiTE6OmKIsTYEujoguS80amrY0lWRUVFI7oOoA5uKphdTDGQHuhhDKEMAsvsgbmaY6jAIwo+KEIv7ANgdzBgKIsVgAAAAAElFTkSuQmCC', + 'A510' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdElEQVR4nM2Quw2AMAxEzwUbmH08goukYQSmCIU3CNmAAqYkosF8ShD4uqeT/WQsl0n4U17xI2kjMsyzRjkhYBTHOHOiAFXH1Dggk7Dz66ZxWsrcF+enhkH23pYYr6zuq+x8o7Hqd3BRo0BRDs5f/e/B3Pit3JTMWCJAbPsAAAAASUVORK5CYII=', + '0774' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAb0lEQVR4nM2QsRGAIAxFk4INcJ809r+QhmlCwQacG9AwpZxVEEs9ze/e/Vzehdo0Sn/KK34sS1gDFIY5UBJFssyXk2XLkCl3WmD8Ym17qy1G49d7oMIy7rIQOGzDDdd96OLi1enIWGb21f8ezI3fARsJzWDPOQA+AAAAAElFTkSuQmCC', + '0F78' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7GB1EQ11DA6Y6IImxBogAyYCAACQxkSkgsUAHESSxgFYgr9EBpg7spKilU8NWLV01NQvJfWB1UxhQzAOLBTCimAeyg9EBVQzkFtYGVL0gFUAxFDcPVPhREWJxHwAQqMvVcHElcQAAAABJRU5ErkJggg==', + '66E6' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZUlEQVR4nGNYhQEaGAYTpIn7WAMYQ1hDHaY6IImJTGFtZW1gCAhAEgtoEWlkbWB0EEAWaxBpAIkhuy8yalrY0tCVqVlI7guZIgo0jxHVvFaRRlegXhECYtjcgs3NAxV+VIRY3AcA+v/LVezBmYoAAAAASUVORK5CYII=', + '8564' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nM2QsQ3AIAwETeENnH2gSO9I0DCNKdgARqBhylAakjJR4u9OL/tk6JcR+FNe8UPeAgQQVowKiXE2acaZBMXmpedRoLDya7G2VnuMyo8KpN05O+8bTI7g5xuD8eKCebhMDNn41fmr/z2YG78TpBPOQiecYIkAAAAASUVORK5CYII=', + '6150' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcklEQVR4nGNYhQEaGAYTpIn7WAMYAlhDHVqRxUSmMAawNjBMdUASC2hhBYkFBCCLAfmsUxkdRJDcFxm1KmppZmbWNCT3hUxhCGBoCISpg+htxS7G2hCAYocIUC+jowOKW4AuCWUIZUBx80CFHxUhFvcBAHASygaQAM4/AAAAAElFTkSuQmCC', + 'BB5A' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QgNEQ1hDHVqRxQKmiLSyNjBMdUAWaxVpdG1gCAhAVzeV0UEEyX2hUVPDlmZmZk1Dch9IHUNDIEwd3DyHhsDQEAw70NQB9TI6OqKIgdzMEMqIIjZQ4UdFiMV9ALWqzUHNtgc3AAAAAElFTkSuQmCC', + 'CF6F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAYklEQVR4nGNYhQEaGAYTpIn7WENEQx1CGUNDkMREWkUaGB0dHZDVBTSKNLA2oIk1gMQYYWJgJ0Wtmhq2dOrK0Cwk94HVoZsH1huIxQ5UMWxuYQ0RaWAIZUQRG6jwoyLE4j4AjSXJ9uiwkoUAAAAASUVORK5CYII=', + 'B0C0' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXElEQVR4nGNYhQEaGAYTpIn7QgMYAhhCHVqRxQKmMIYwOgRMdUAWa2VtZW0QCAhAUSfS6NrA6CCC5L7QqGkrU1etzJqG5D40dVDzsIlhswPTLdjcPFDhR0WIxX0AWeXNH+c/IFcAAAAASUVORK5CYII=', + '5744' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7QkNEQx0aHRoCkMSA7EaHVodGDLGpDq3IYoEBDK0MgQ5TApDcFzZt1bSVmVlRUcjua2UIYG10dEDWy9DK6MAaGhgagmxHKyvIFhS3iEwRwRBjDcAUG6jwoyLE4j4AAbvPAAhYjjUAAAAASUVORK5CYII=', + '2E45' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAc0lEQVR4nGNYhQEaGAYTpIn7WANEQxkaHUMDkMREpog0MLQ6OiCrC2gFik1FFWMAiQU6ujogu2/a1LCVmZlRUcjuCxBpYG10aBBB0svoABQD2oosxgriNTo6IIuJgMUcApDdFxoKcrPDVIdBEH5UhFjcBwAGjMtvlSqn6wAAAABJRU5ErkJggg==', + '869F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZElEQVR4nGNYhQEaGAYTpIn7WAMYQxhCGUNDkMREprC2Mjo6OiCrC2gVaWRtCEQRE5ki0oAkBnbS0qhpYSszI0OzkNwnMkW0lSEkEMM8hwZMMUcMOzDdAnUzithAhR8VIRb3AQAL6Mmjz2O9lwAAAABJRU5ErkJggg==', + 'AAD5' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7GB0YAlhDGUMDkMRYAxhDWBsdHZDViUxhbWVtCEQRC2gVaXRtCHR1QHJf1NJpK1NXRUZFIbkPoi6gQQRJb2ioaCi6GNQ8BwyxRoeAAHSxUIapDoMg/KgIsbgPADHwzcH/rz0jAAAAAElFTkSuQmCC', + '5CF6' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QkMYQ1lDA6Y6IIkFNLA2ujYwBASgiIk0uDYwOgggiQUGiDSwAsWQ3Rc2bdqqpaErU7OQ3dcKVodiHlTMQQTZjlaIHchiIlMw3cIaAHRzAwOKmwcq/KgIsbgPAAPzy+QDMi3bAAAAAElFTkSuQmCC', + 'ED9F' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAV0lEQVR4nGNYhQEaGAYTpIn7QkNEQxhCGUNDkMQCGkRaGR0dHRhQxRpdGwLxiYGdFBo1bWVmZmRoFpL7QOocQjD1OmAxzxFTDMMtUDejiA1U+FERYnEfAKF/y6FiqBQaAAAAAElFTkSuQmCC', + '725C' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAc0lEQVR4nGNYhQEaGAYTpIn7QkMZQ1hDHaYGIIu2srayNjAEiKCIiTS6NjA6sCCLTWFodJ3K6IDivqhVS5dmZmYhuw+oYgpDQ6ADsr0g89HFRIAqWYFiyHYEAFUyOjqguCWgQTTUIZQB1c0DFH5UhFjcBwAo5sqdAUi9TwAAAABJRU5ErkJggg==', + '968D' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAY0lEQVR4nGNYhQEaGAYTpIn7WAMYQxhCGUMdkMREprC2Mjo6OgQgiQW0ijSyNgQ6iKCKNYDUiSC5b9rUaWGrQldmTUNyH6uraCuSOggEmueKZp4AFjFsbsHm5oEKPypCLO4DAOxPymXydAQuAAAAAElFTkSuQmCC', + 'DA91' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbElEQVR4nGNYhQEaGAYTpIn7QgMYAhhCGVqRxQKmMIYwOjpMRRFrZW1lbQgIRRUTaXQFksjui1o6bWVmZtRSZPeB1DmEBKDa0Soa6tCALibS6IguNgUo5uiAIhYaADQvlCE0YBCEHxUhFvcBALSqzosDsdMJAAAAAElFTkSuQmCC', + '36A2' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcUlEQVR4nGNYhQEaGAYTpIn7RAMYQximMEx1QBILmMLayhDKEBCArLJVpJHR0dFBBFlsikgDa0NAgwiS+1ZGTQtbuioKCJHcN0W0Faiu0QHNPNfQgFYGdDGg7QxobgHqDUB3M2tDYGjIIAg/KkIs7gMAp1XMy0GkH0oAAAAASUVORK5CYII=', + 'C35E' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAaElEQVR4nGNYhQEaGAYTpIn7WEOAMNQxNABJTKRVpJW1gdEBWV1AI0OjK7pYA0Mr61S4GNhJUatWhS3NzAzNQnIfSB1DQyC63kYHdDGwHahiILcwOjqiiIHczBDKiOLmgQo/KkIs7gMAyTvKSW3ChloAAAAASUVORK5CYII=', + '3E15' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7RANEQxmmMIYGIIkFTBFpYAhhdEBR2SrSwIguBlI3hdHVAcl9K6Omhq2atjIqCtl9YHUMDSJo5mEXY3QQQXfLFIYAZPeB3MwY6jDVYRCEHxUhFvcBAI67ylZN/A5jAAAAAElFTkSuQmCC', + '2F65' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAcklEQVR4nM2QsQ2AMAwE7SIbmH2cgt4Upsg0btiAsAEFTElC5QhKkOLvTv/SyXA+zqCn/OIXZFBWVHGMVjKMkX1PFrJgLYOb4cjeb8vzno+UvJ+UXmQjt0WuW2lYsMom9oysurB4P9XSUMjcwf8+zIvfBTmsysrEdM0vAAAAAElFTkSuQmCC', + 'E60C' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAX0lEQVR4nGNYhQEaGAYTpIn7QkMYQximMEwNQBILaGBtZQhlCBBBERNpZHR0dGBBFWtgbQh0QHZfaNS0sKWrIrOQ3RfQINqKpA5unisWMUcMOzDdgs3NAxV+VIRY3AcA4X7MAwCJ8VoAAAAASUVORK5CYII=', + '7B44' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbUlEQVR4nGNYhQEaGAYTpIn7QkNFQxgaHRoCkEVbRVoZWh0a0cQaHaY6tKKITQGqC3SYEoDsvqipYSszs6KikNzH6CDSytro6ICsl7VBpNE1NDA0BElMBCjmgOaWgAagHRhiWNw8QOFHRYjFfQCIBc8FR+n6agAAAABJRU5ErkJggg==', + '7C16' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAbklEQVR4nGNYhQEaGAYTpIn7QkMZQxmmMEx1QBZtZW10CGEICEARE2lwDGF0EEAWmyICxIwOKO6LmrZq1bSVqVlI7mN0AKtDMY+1AaJXBElMBAgd0MQCGoBumYLqloAGRqCrHVDdPEDhR0WIxX0APT3LoyIZ2K4AAAAASUVORK5CYII=', + '1129' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAZklEQVR4nGNYhQEaGAYTpIn7GB0YAhhCGaY6IImxOjAGMDo6BAQgiYk6sAawNgQ6iKDrRYiBnbQya1UUkIgKQ3IfWF0rw1QMvVMYGjDEAhgw7ABhFLeEsIayhgaguHmgwo+KEIv7AKJixi3WghgIAAAAAElFTkSuQmCC', + '038B' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAXElEQVR4nGNYhQEaGAYTpIn7GB1YQxhCGUMdkMRYA0RaGR0dHQKQxESmMDS6NgQ6iCCJBbQyIKsDOylq6aqwVaErQ7OQ3IemDiaGYR42O7C5BZubByr8qAixuA8A/DPKfflFnKkAAAAASUVORK5CYII=', + 'FD96' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAW0lEQVR4nGNYhQEaGAYTpIn7QkNFQxhCGaY6IIkFNIi0Mjo6BASgijW6NgQ6CGARQ3ZfaNS0lZmZkalZSO4DqXMICcQwzwGoVwRNzBFTDItbMN08UOFHRYjFfQBCEs3uUm25TAAAAABJRU5ErkJggg==', + 'BD0C' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAWklEQVR4nGNYhQEaGAYTpIn7QgNEQximMEwNQBILmCLSyhDKECCCLNYq0ujo6OjAgqqu0bUh0AHZfaFR01amrorMQnYfmjq4edjEsNiB4RZsbh6o8KMixOI+AL4DzW+cuJRxAAAAAElFTkSuQmCC', + '25AD' => 'iVBORw0KGgoAAAANSUhEUgAAAEkAAAAhAgMAAADoum54AAAACVBMVEX///8AAADS0tIrj1xmAAAAdElEQVR4nGNYhQEaGAYTpIn7WANEQxmmMIY6IImJTBFpYAhldAhAEgtoFWlgdHR0EEHW3SoSwtoQCBODuGna1KVLV0VmTUN2XwBDoytCHRgyOgDFQlHFWBtEMNSJNLC2guxAdktoKCPIXhQ3D1T4URFicR8A/K3LfS3XHTAAAAAASUVORK5CYII=' + ); + $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/contact.lib.php b/contact.lib.php new file mode 100644 index 0000000..a8b2766 --- /dev/null +++ b/contact.lib.php @@ -0,0 +1,3389 @@ +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 = "