gluon-web-remote

Web remote Administration for big size of gluon routers
git clone git://archive.git.mtrnord.blog/MTRNord/gluon-web-remote.git
Log | Files | Refs | README

function.mailto.php (5392B)


      1 <?php
      2 /**
      3  * Smarty plugin
      4  *
      5  * @package    Smarty
      6  * @subpackage PluginsFunction
      7  */
      8 
      9 /**
     10  * Smarty {mailto} function plugin
     11  * Type:     function<br>
     12  * Name:     mailto<br>
     13  * Date:     May 21, 2002
     14  * Purpose:  automate mailto address link creation, and optionally encode them.<br>
     15  * Params:
     16  * <pre>
     17  * - address    - (required) - e-mail address
     18  * - text       - (optional) - text to display, default is address
     19  * - encode     - (optional) - can be one of:
     20  *                             * none : no encoding (default)
     21  *                             * javascript : encode with javascript
     22  *                             * javascript_charcode : encode with javascript charcode
     23  *                             * hex : encode with hexidecimal (no javascript)
     24  * - cc         - (optional) - address(es) to carbon copy
     25  * - bcc        - (optional) - address(es) to blind carbon copy
     26  * - subject    - (optional) - e-mail subject
     27  * - newsgroups - (optional) - newsgroup(s) to post to
     28  * - followupto - (optional) - address(es) to follow up to
     29  * - extra      - (optional) - extra tags for the href link
     30  * </pre>
     31  * Examples:
     32  * <pre>
     33  * {mailto address="me@domain.com"}
     34  * {mailto address="me@domain.com" encode="javascript"}
     35  * {mailto address="me@domain.com" encode="hex"}
     36  * {mailto address="me@domain.com" subject="Hello to you!"}
     37  * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
     38  * {mailto address="me@domain.com" extra='class="mailto"'}
     39  * </pre>
     40  *
     41  * @link     http://www.smarty.net/manual/en/language.function.mailto.php {mailto}
     42  *           (Smarty online manual)
     43  * @version  1.2
     44  * @author   Monte Ohrt <monte at ohrt dot com>
     45  * @author   credits to Jason Sweat (added cc, bcc and subject functionality)
     46  *
     47  * @param array $params parameters
     48  *
     49  * @return string
     50  */
     51 function smarty_function_mailto($params)
     52 {
     53     static $_allowed_encoding = array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true);
     54     $extra = '';
     55 
     56     if (empty($params['address'])) {
     57         trigger_error("mailto: missing 'address' parameter", E_USER_WARNING);
     58 
     59         return;
     60     } else {
     61         $address = $params['address'];
     62     }
     63 
     64     $text = $address;
     65     // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
     66     // so, don't encode it.
     67     $search = array('%40', '%2C');
     68     $replace = array('@', ',');
     69     $mail_parms = array();
     70     foreach ($params as $var => $value) {
     71         switch ($var) {
     72             case 'cc':
     73             case 'bcc':
     74             case 'followupto':
     75             if (!empty($value)) {
     76                 $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value));
     77             }
     78                 break;
     79 
     80             case 'subject':
     81             case 'newsgroups':
     82                 $mail_parms[] = $var . '=' . rawurlencode($value);
     83                 break;
     84 
     85             case 'extra':
     86             case 'text':
     87                 $$var = $value;
     88 
     89             default:
     90         }
     91     }
     92 
     93     if ($mail_parms) {
     94         $address .= '?' . join('&', $mail_parms);
     95     }
     96 
     97     $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
     98     if (!isset($_allowed_encoding[$encode])) {
     99         trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING);
    100 
    101         return;
    102     }
    103     // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed!
    104     if ($encode == 'javascript') {
    105         $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');';
    106 
    107         $js_encode = '';
    108         for ($x = 0, $_length = strlen($string); $x < $_length; $x ++) {
    109             $js_encode .= '%' . bin2hex($string[$x]);
    110         }
    111 
    112         return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>';
    113     } elseif ($encode == 'javascript_charcode') {
    114         $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
    115 
    116         for ($x = 0, $y = strlen($string); $x < $y; $x ++) {
    117             $ord[] = ord($string[$x]);
    118         }
    119 
    120         $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n"
    121             . "{document.write(String.fromCharCode("
    122             . implode(',', $ord)
    123             . "))"
    124             . "}\n"
    125             . "</script>\n";
    126 
    127         return $_ret;
    128     } elseif ($encode == 'hex') {
    129         preg_match('!^(.*)(\?.*)$!', $address, $match);
    130         if (!empty($match[2])) {
    131             trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING);
    132 
    133             return;
    134         }
    135         $address_encode = '';
    136         for ($x = 0, $_length = strlen($address); $x < $_length; $x ++) {
    137             if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[$x])) {
    138                 $address_encode .= '%' . bin2hex($address[$x]);
    139             } else {
    140                 $address_encode .= $address[$x];
    141             }
    142         }
    143         $text_encode = '';
    144         for ($x = 0, $_length = strlen($text); $x < $_length; $x ++) {
    145             $text_encode .= '&#x' . bin2hex($text[$x]) . ';';
    146         }
    147 
    148         $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
    149 
    150         return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
    151     } else {
    152         // no encoding
    153         return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
    154     }
    155 }