<?php

// $Id: feedback.module,v 1.23 2005/01/06 19:59:54 kbahey Exp $

function feedback_help ($section = 'admin/help#feedback')
{
  $output = '';

  switch ($section) {

    case 'admin/help#feedback':
      $output .= t("
      <p>Users with the correct <a href=\"%permissions\">permissions</a> can send feedback
       to the site admin via email from a form on the site.</p>
      <p>To enable its use, a user needs the \"access feedback\" permission.</p>
      <p>The site admin specifies the email address that the users send to, as well as other
       parameters, such as what fields to show the user to fill (name, address, email), whether
       the user address is to be validated, and whether to log all attempts to use this form.</p>
      <p>The email address is never visible to the users, and therefore cannot be used by SPAM
       harvesters.</p>",
       array("%permissions" => url("admin/user/permission"), "%feedback" => url("feedback")));
      break;
    case 'admin/modules#description':
      $output = t("Enables visitors to your site to provide feedback from a web form.");
      break;
  }

  return $output;
}

function feedback_perm()
{
  return array ("access feedback");
}

function feedback_menu($may_cache) {
  global $user;
  $items = array();

  $access = user_access('access feedback');
  $title  = t(variable_get("feedback_nav_link", "feedback"));

  if ($may_cache) {
    $items[] = array(
	'path'     => 'feedback',
        'title'    => $title,
        'callback' => 'feedback_page',
	'access'   => $access,
        'weight'   => 0);
  }

  return $items;
}

function feedback_settings()
{
  $output .= form_textfield(t("Navigation link text"), "feedback_nav_link",
    variable_get("feedback_nav_link", "feedback"), 80, 300,
    t("The text that will be shown in the navigation link"));

  $output .= form_textfield(t("Default Email Address"), "feedback_email",
    variable_get("feedback_email", ""), 80, 300,
    t("The email address which should receive all form submissions"));

  $output .= form_textfield (t("Subject Prefix"), "feedback_subject_prefix",
    variable_get("feedback_subject_prefix", "Feedback: "), 80, 80, 
    t("The prefix that should be added before the subject on each email"));

  $output .= form_textarea  (t("Instructions"), "feedback_instructions",
    variable_get("feedback_instructions", "Enter your message below: "), 60, 10, 
    t("The instructions that will be displayed for the user on how to fill the form"));

  $output .= "<p>Fields to include on the form:</p>";

  $output .= form_checkbox (t("Sender Email Address"), "feedback_field_email", 1,
    variable_get("feedback_field_email", "1") );

  $output .= form_checkbox (t("Sender Name"), "feedback_field_name", 1,
    variable_get("feedback_field_name", "1") );

  $output .= form_checkbox (t("Postal Address"), "feedback_field_postal", 0,
    variable_get("feedback_field_postal", "0") );

  $output .= form_checkbox (t("Phone Number"), "feedback_field_phone", 0,
    variable_get("feedback_field_phone", "0") );

  $output .= form_checkbox (t("Message Subject"), "feedback_field_subject", 1,
    variable_get("feedback_field_subject", "1") );

  $output .= form_checkbox (t("Message Body"), "feedback_field_body", 1,
    variable_get("feedback_field_body", "1") );

  $output .= "<p>Miscellaneous Settings:</p>";

  $output .= form_checkbox (t("Validate Sender's Email Address"),
  	"feedback_validate_sender_address", 1,
    	variable_get("feedback_validate_sender_address", "1") );

  $output .= form_checkbox (t("Log all Send attempts"), "feedback_logging", 1,
    variable_get("feedback_logging", "1") );

  return $output;
}

function feedback_page()
{
  $edit = $_POST["edit"];
  $op = arg(1);
  
  if ($edit)
    {
    if ( variable_get("feedback_logging", "1") )
    	{
    	feedback_watchdog_log();
	}

    $errmsg = feedback_validate_data();
    if ( $errmsg == "")
  	{
  	feedback_send_email();
        drupal_set_message(t("Thank you for your message."));
        print theme("page", $output);
	}
    else
        {
        drupal_set_message(t("There are errors in your form."));
        print theme("page", $errmsg );
	}
    }
  else
    {
    $form = feedback_display_form () ;
    print theme("page", $form);
    }
}

function feedback_send_email()
{
  $edit = $_POST["edit"];

  $subject_prefix = variable_get("feedback_subject_prefix", "");
  
  $subject = $subject_prefix . " " . $edit["form_field_subject"] ;

  $from_email = $edit["form_field_email"] ? $edit["form_field_email"] : 
  	variable_get("site_mail", ini_get("sendmail_from"));

  $to = variable_get("feedback_email", "");

  $body = feedback_format_body($edit["form_field_body"]) . "\n\n" . feedback_custom_footers();

  $headers = feedback_custom_headers();

  if ( $to )
     {
     user_mail($to, $subject, $body, $headers);
     $rc = true;
     }
  else
     {
     $rc = false;
     }

  return $rc;
}

function feedback_display_form ()
{

  global $user;

  $edit = $_POST["edit"];

  $edit['form_field_name']  = "";
  $edit['form_field_email'] = "";

  if ( $user->name )
  	{
	$edit['form_field_name'] = $user->name ;
	}

  if ( $user->mail )
  	{
	$edit['form_field_email'] = $user->mail ;
	}

  $title  .= t("Use this form to send us feedback");

  $instructions = variable_get("feedback_instructions", "");

  if ( $instructions )
  	{
  	$message .= t($instructions);
	}
  else
  	{
  	$message .= t("Enter your message below:");
	}
  	
  if ( variable_get("feedback_field_name", "") )
  	$form .= form_textfield (t("Your Full Name"), "form_field_name", 
		$edit['form_field_name'],  60, 64);

  if ( variable_get("feedback_field_email", "") )
  	$form .= form_textfield (t("Your E-Mail Address"), "form_field_email",
		$edit['form_field_email'], 60, 64);

  if ( variable_get("feedback_field_postal", "") ) 
  	$form .= form_textfield (t("Your Postal Address"), "form_field_postal",
		$edit['form_field_postal'], 60, 64);

  if ( variable_get("feedback_field_phone", "") ) 
  	$form .= form_textfield (t("Your Phone Number"), "form_field_phone",
		$edit['form_field_phone'], 60, 64);

  if ( variable_get("feedback_field_subject", "") ) 
  	$form .= form_textfield (t("Subject"), "form_field_subject",
		$edit['form_field_subject'], 60, 64);

  if ( variable_get("feedback_field_body", "") ) 
  	$form .= form_textarea  (t("Message"), "form_field_body", 
		$edit['form_field_body'], 60, 15);

  $form .= form_hidden ("form_field_referer", $_SERVER[HTTP_REFERER]);

  $form .= form_submit (t("Send Message"), "op", $edit['op'] );

  $output .= theme("box", $title, $message . form($form, "post"));

  return $output;
}

function feedback_watchdog_log()
{
  $edit = $_POST["edit"];

  $name  = $edit["form_field_name"] ;
  $email = $edit["form_field_email"] ; 
  $subj  = $edit["form_field_subject"] ; 

  $message = "feedback: $name <$email> subject: $subj";

  watchdog ( "user", $message )  ;
}

function feedback_validate_data( )
{
  global $user;
  $edit = $_POST["edit"];

  $name  = $edit["form_field_name"] ;
  $email = $edit["form_field_email"] ; 
  $subj  = $edit["form_field_subject"] ; 
  $body  = $edit["form_field_body"] ; 
  $postal= $edit["form_field_postal"] ; 
  $phone = $edit["form_field_phone"] ; 

  $error_msg = "";

  if (empty ($email) && variable_get ("feedback_field_email", "") )
     {
     $error_msg .= t("Error: E-Mail address is required<br>");
     }
  else
     {
     $smtp_err = feedback_validate_email ($email);
     if ( $smtp_err != "" )
        {
        $error_msg .= t("Error: E-Mail address error:<br> SMTP Info: ") . $smtp_err . "<br>";
        }
     }

  if (empty($name) && variable_get("feedback_field_name", "") )
    {
    $error_msg .= t("Error: Full name is required<br>");
    }

  if (empty($body) && variable_get ("feedback_field_body", "") )
    {
    $error_msg .= t("Error: Message Body is required<br>");
    }

  if (empty($subj) && variable_get ("feedback_field_subject", "") )
    {
    $error_msg .= t("Error: Subject is required<br>");
    }

  if (empty($postal) && variable_get ("feedback_field_postal", "") )
    {
    $error_msg .= t("Error: Postal is required<br>");
    }

  if (empty($phone) && variable_get ("feedback_field_phone", "") )
    {
    $error_msg .= t("Error: Phone is required<br>");
    }

 if (empty($error_msg))
    {
    return "";
    }
 else
    {
    $error_msg = t("The form could not be processed due to the following errors:<br><br>") .
    	$error_msg;
  
    return $error_msg;
    }
}

function feedback_validate_email ($email)
{
 if (valid_email_address($email))
    {
    // It looks like a valid email address
    if ( variable_get ("feedback_validate_sender_address", "") )
       {
       $rc = feedback_try_to_feedback_address ( $email );
       }
    else
       {
       $rc = "";
       }
    }
 else
    {
    $rc = t("Invalid E-mail address structure");
    }

 return $rc;    
}

function feedback_try_to_feedback_address ( $email )
{

 // This function is based on one that was written by
 // Jon S. Stevens jon AT clearink.com
 // Copyright 1998 Jon S. Stevens, Clear Ink
 // This code has all the normal disclaimers.
 // It is free for any use, just keep the credits intact.

$server_name = $_SERVER['SERVER_NAME'];
    
$rc = "Undefined error";

list ( $user, $domain )  = split ( "@", $email, 2 );
$arr = explode ( ".", $domain );
$count = count ( $arr );
$tld = $arr[$count - 2] . "." . $arr[$count - 1];

if ( !$tld )
   {
   $rc = "Error: Invalid domain part in e-mail";
   return $rc;
   }

if ( checkdnsrr ( $tld, "MX" ) )
    {
    if ( getmxrr ( $tld, $mxhosts, $weight ) )
       {
       for ( $i = 0; $i < count ( $mxhosts ); $i++ )
          {
          $fp = fsockopen ( $mxhosts[$i], 25 );
          if ( $fp )
             {
                $s = 0;
                $c = 0;
                $out = "";
                set_socket_blocking ( $fp, false );
                do
                   {
                   $out = fgets ( $fp, 2500 );
                   if ( ereg ( "^220", $out ) )
                      {
                      $s = 0;
                      $out = "";
                      $c++;
                      }
                   else
		   if ( ( $c > 0 ) && ( $out == "" ) )
                      {
		      break;
		      }
                   else
                      {
		      $s++;
		      }

                   if ( $s == 9999 )
		      {
		      break;
		      }
                   } while ( $out == "" );

                set_socket_blocking ( $fp, true );

                fputs ( $fp, "HELO $server_name\n" );
                $output = fgets ( $fp, 2000 );
                fputs ( $fp, "MAIL FROM: <info@" . $tld . ">\n" );
                $output = fgets ( $fp, 2000 );
                fputs ( $fp, "RCPT TO: <$email>\n" );            
                $output = fgets ( $fp, 2000 );
                if ( ereg ( "^250", $output ) )
		   {
                   $rc = "";
                   }
		else
		   {
                   $rc = $output;
                   }

                fputs ( $fp, "QUIT\n" );
                fclose( $fp );

                if ( $rc == "" )
                   {
		   break;
		   }
             }
          }
       }
    }
    return $rc;
}

function feedback_custom_footers()
{
  global $user;

  $edit = $_POST["edit"];
  $site_name =  variable_get("site_name", "") ;

  $footer .= "\n----------------------------------";
  if ( $site_name )
  	$footer .= "\nSite Name       : " . variable_get("site_name", "") ;
  if ( $user->name )
  	$footer .= "\nRegistered name : " . $user->name;
  if ( $edit[form_field_name] )
  	$footer .= "\nFull Name       : $edit[form_field_name]";
  if ( $edit[form_field_email] )
  	$footer .= "\nE-mail address  : $edit[form_field_email]";
  if ( $edit[form_field_postal] )
  	$footer .= "\nPostal address  : $edit[form_field_postal]";
  if ( $edit[form_field_phone] )
  	$footer .= "\nPhone Number    : $edit[form_field_phone]";
  if ( $edit[form_field_referer] )
  	$footer .= "\nReferring page  : $edit[form_field_referer]";
  if ( $_SERVER[REMOTE_ADDR] )
  	$footer .= "\nIP Address      : $_SERVER[REMOTE_ADDR]";
  if ( $_SERVER[REMOTE_HOST] )
  	$footer .= "\nMachine name    : $_SERVER[REMOTE_HOST]";
  if ( $_SERVER[HTTP_USER_AGENT] )
  	$footer .= "\nBrowser info    : $_SERVER[HTTP_USER_AGENT]";

  return $footer;
}

function feedback_custom_headers()
{
  $edit = $_POST["edit"];

  $headers = "";

  $name = $edit["form_field_name"];

  $headers .= "From: $name " . " <" . $edit["form_field_email"] . ">\n";
  $headers .= "Reply-To: $edit[form_field_email]\n";
  $headers .= "Return-Path: $edit[form_field_email]\n";
  $headers .= "Errors-To: $edit[form_field_email]\n";
  $headers .= "X-Mailer: Drupal\n";

  return $headers;
}

function feedback_format_body ( $body )
{
  $edit = $_POST["edit"];

  $body  = "-- The following message was sent using the feedback page --";
  $body .= "\n\n$edit[form_field_body]";

  $body = wordwrap(strip_tags($body),72);

  $trans = get_html_translation_table(HTML_ENTITIES);
  $trans = array_flip($trans);

  $body = strtr($body, $trans);

  return $body;
}

?>
