mcramer
2012-06-18 a932880cc9dcd6da7e42f5a69534322c79f75953
interface/lib/classes/functions.inc.php
@@ -34,7 +34,7 @@
class functions {
   
   public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '') {
   public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '', $cc = '', $bcc = '') {
      global $app,$conf;
      
      if($conf['demo_mode'] == true) $app->error("Mail sending disabled in demo mode.");
@@ -53,7 +53,9 @@
            unset($path_parts);
         }
         $header = "Return-Path: $form\nFrom: $from\nReply-To: $from\n";
         $header = "Return-Path: $from\nFrom: $from\nReply-To: $from\n";
         if($cc != '') $header .= "Cc: $cc\n";
         if($bcc != '') $header .= "Bcc: $bcc\n";
         $header .= "MIME-Version: 1.0\n";
         $header .= "Content-Type: multipart/mixed; boundary=$uid\n";
@@ -74,6 +76,8 @@
         mail($to, $subject, "", $header);
      } else {
         $header = "From: $from\nReply-To: $from\n";
         if($cc != '') $header .= "Cc: $cc\n";
         if($bcc != '') $header .= "Bcc: $bcc\n";
         $header .= "Content-Type: text/plain;\n\tcharset=\"UTF-8\"\n";
         $header .= "Content-Transfer-Encoding: 8bit\n\n";
         $subject      = "=?utf-8?B?".base64_encode($subject)."?=";
@@ -101,7 +105,7 @@
   }
   
   public function get_ispconfig_url() {
      $url = (stristr($_SERVER['SERVER_PROTOCOL'],'HTTPS'))?'https':'http';
      $url = (stristr($_SERVER['SERVER_PROTOCOL'],'HTTPS') || stristr($_SERVER['HTTPS'],'on'))?'https':'http';
      $url .= '://'.$_SERVER['SERVER_NAME'];
      if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
         $url .= ':'.$_SERVER['SERVER_PORT'];
@@ -111,38 +115,64 @@
   
    function json_encode($data) {
      if(!function_exists('json_encode')){
         switch ($type = gettype($data)){
            case 'NULL':
               return 'null';
            case 'boolean':
               return ($data ? 'true' : 'false');
            case 'integer':
            case 'double':
            case 'float':
               return $data;
            case 'string':
               return '"' . addslashes($data) . '"';
            case 'object':
               $data = get_object_vars($data);
            case 'array':
               $output_index_count = 0;
               $output_indexed = array();
               $output_associative = array();
               foreach($data as $key => $value){
                  $output_indexed[] = $this->json_encode($value);
                  $output_associative[] = $this->json_encode($key) . ':' . $this->json_encode($value);
                  if($output_index_count !== NULL && $output_index_count++ !== $key){
                     $output_index_count = NULL;
                  }
         if(is_array($data) || is_object($data)){
            $islist = is_array($data) && (empty($data) || array_keys($data) === range(0,count($data)-1));
            if($islist){
               $json = '[' . implode(',', array_map(array($this, "json_encode"), $data) ) . ']';
            } else {
               $items = Array();
               foreach( $data as $key => $value ) {
                  $items[] = $this->json_encode("$key") . ':' . $this->json_encode($value);
               }
               if($output_index_count !== NULL){
                  return '[' . implode(',', $output_indexed) . ']';
               } else {
                  return '{' . implode(',', $output_associative) . '}';
               $json = '{' . implode(',', $items) . '}';
            }
         } elseif(is_string($data)){
            # Escape non-printable or Non-ASCII characters.
            # I also put the \\ character first, as suggested in comments on the 'addclashes' page.
            $string = '"'.addcslashes($data, "\\\"\n\r\t/".chr(8).chr(12)).'"';
            $json = '';
            $len = strlen($string);
            # Convert UTF-8 to Hexadecimal Codepoints.
            for($i = 0; $i < $len; $i++){
               $char = $string[$i];
               $c1 = ord($char);
               # Single byte;
               if($c1 <128){
                  $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1);
                  continue;
               }
            default:
               return ''; // Not supported
               # Double byte
               $c2 = ord($string[++$i]);
               if(($c1 & 32) === 0){
                  $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128);
                  continue;
               }
               # Triple
               $c3 = ord($string[++$i]);
               if(($c1 & 16) === 0){
                  $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
                  continue;
               }
               # Quadruple
               $c4 = ord($string[++$i]);
               if(($c1 & 8) === 0){
                  $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1;
                  $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3);
                  $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128);
                  $json .= sprintf("\\u%04x\\u%04x", $w1, $w2);
               }
            }
         } else {
            # int, floats, bools, null
            $json = strtolower(var_export($data, true));
         }
         return $json;
      } else {
         return json_encode($data);
      }