ftimme
2012-05-15 77dbe51165580e4c1098c0acad3664442068361c
interface/lib/classes/functions.inc.php
@@ -45,6 +45,7 @@
         $content = file_get_contents($filepath);
         $content = chunk_split(base64_encode($content));
         $uid = strtoupper(md5(uniqid(time())));
         $subject      = "=?utf-8?B?".base64_encode($subject)."?=";
         
         if($filename == '') {
            $path_parts = pathinfo($filepath);
@@ -73,6 +74,9 @@
         mail($to, $subject, "", $header);
      } else {
         $header = "From: $from\nReply-To: $from\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)."?=";
         mail($to, $subject, $text, $header);
      }
@@ -105,6 +109,72 @@
      return $url;
   }
   
    function json_encode($data) {
      if(!function_exists('json_encode')){
         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);
               }
               $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;
               }
               # 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);
      }
    }
      
}