<?php

class WDFText {
    ////////////////////////////////////////////////////////////////////////////////////////
    // Events                                                                             //
    ////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////
    // Constants                                                                          //
    ////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////
    // Variables                                                                          //
    ////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////
    // Constructor & Destructor                                                           //
    ////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////
    // Public Methods                                                                     //
    ////////////////////////////////////////////////////////////////////////////////////////
    /**
     * Gets component translated text.
     *
     * @param    string $text text to translate.
     * @args    mixed arguments for sprintf.
     *
     * @return  string  translated text.
     */
    public static function get($text) {
      // $args = func_get_args();
      // $result = call_user_func_array('sprintf', $args);
      $result = __($text, 'wde');
      return $result;
    }
	
    public static function get_mod($text, $extens_name = "" ) {
        $com_name = WDFHelper::get_com_name();
		
        $args = func_get_args();

        $args[0] = 'MOD_' . strtoupper($extens_name) . '_' . $args[0];
        $result = call_user_func_array('sprintf', $args);

        return $result;
    }

    public static function truncate_html($text, $length = 100, $ending = '...', $exact = false, $considerHtml = true) {
      if ($considerHtml) {
        // if the plain text is shorter than the maximum length, return the whole text
        if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
          return $text;
        }
        // splits all html-tags to scanable lines
        preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
        $total_length = strlen($ending);
        $open_tags = array();
        $truncate = '';
        foreach ($lines as $line_matchings) {
          // if there is any html-tag in this line, handle it and add it (uncounted) to the output
          if (!empty($line_matchings[1])) {
            // if it's an "empty element" with or without xhtml-conform closing slash
            if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
              // do nothing
            // if tag is a closing tag
            } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
              // delete tag from $open_tags list
              $pos = array_search($tag_matchings[1], $open_tags);
              if ($pos !== false) {
              unset($open_tags[$pos]);
              }
            // if tag is an opening tag
            } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
              // add tag to the beginning of $open_tags list
              array_unshift($open_tags, strtolower($tag_matchings[1]));
            }
            // add html-tag to $truncate'd text
            $truncate .= $line_matchings[1];
          }
          // calculate the length of the plain text part of the line; handle entities as one character
          $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
          if ($total_length+$content_length> $length) {
            // the number of characters which are left
            $left = $length - $total_length;
            $entities_length = 0;
            // search for html entities
            if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
              // calculate the real length of all entities in the legal range
              foreach ($entities[0] as $entity) {
                if ($entity[1]+1-$entities_length <= $left) {
                  $left--;
                  $entities_length += strlen($entity[0]);
                } else {
                  // no more characters left
                  break;
                }
              }
            }
            $truncate .= substr($line_matchings[2], 0, $left+$entities_length);
            // maximum lenght is reached, so get off the loop
            break;
          } else {
            $truncate .= $line_matchings[2];
            $total_length += $content_length;
          }
          // if the maximum length is reached, get off the loop
          if($total_length>= $length) {
            break;
          }
        }
      } else {
        if (strlen($text) <= $length) {
          return $text;
        } else {
          $truncate = substr($text, 0, $length - strlen($ending));
        }
      }
      // if the words shouldn't be cut in the middle...
      if (!$exact) {
        // ...search the last occurance of a space...
        $spacepos = strrpos($truncate, ' ');
        if (isset($spacepos)) {
          // ...and cut the text in this position
          //$truncate = substr($truncate, 0, $spacepos);
          $truncate = join("", array_slice( preg_split("//u", $truncate, -1, PREG_SPLIT_NO_EMPTY), 0, $spacepos));
        }
      }
      // add the defined ending to the text
      $truncate .= $ending;
      if($considerHtml) {
        // close all unclosed html-tags
        foreach ($open_tags as $tag) {
          $truncate .= '</' . $tag . '>';
        }
      }
      return $truncate;
    }

    public static function float_val($num, $decimals) {
      if (gettype($num) == 'double') {
        return $num;
      }
      $dotPos = strrpos($num, '.');
      $commaPos = strrpos($num, ',');
      $sep = FALSE;
      if ($dotPos !== FALSE && $commaPos !== FALSE) {
        $sep = ($dotPos > $commaPos) ? $dotPos : $commaPos;
      }
      else {
        if ($dotPos !== FALSE) {
          $sep = $dotPos;
        }
        elseif ($commaPos !== FALSE) {
          $sep = $commaPos;
        }
        if ($sep !== FALSE && $sep + /*$decimals*/2 + 1 < strlen($num)) {
          $sep = FALSE;
        }
      }
      if ($sep !== FALSE) {
        $num = preg_replace("/[,\.]/", "", substr($num, 0, $sep)) . '.' . substr($num, $sep + 1, strlen($num));
      }
      else {
        $num = preg_replace("/[,\.]/", "", $num);
      }
      return floatval($num);
    }
	
    public static function wde_number_format($text, $decimals) {
      return number_format(self::float_val($text, $decimals), $decimals);
    }


    ////////////////////////////////////////////////////////////////////////////////////////
    // Getters & Setters                                                                  //
    ////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////
    // Private Methods                                                                    //
    ////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////
    // Listeners                                                                          //
    ////////////////////////////////////////////////////////////////////////////////////////
}