<?php

/**
 * Originaly:
 * Helper function for drupal_html_to_text().
 *
 * Calls helper function for HTML 4 entity decoding.
 * Per: http://www.lazycat.org/software/html_entity_decode_full.phps
 */
function decode_entities_full($string, $quotes = ENT_COMPAT, $charset = 'ISO-8859-1') {
    $string = str_replace("&nbsp;", " ", $string);
    return html_entity_decode(preg_replace_callback('/&([a-zA-Z][a-zA-Z0-9]+);/', 'convert_entity', $string), $quotes,
        $charset);
}

/**
 * Originaly:
 * Helper function for decode_entities_full().
 *
 * This contains the full HTML 4 Recommendation listing of entities, so the default to discard
 * entities not in the table is generally good. Pass false to the second argument to return
 * the faulty entity unmodified, if you're ill or something.
 * Per: http://www.lazycat.org/software/html_entity_decode_full.phps
 */
function convert_entity($matches, $destroy = true) {
    static $table = array(
        'quot'     => '&#34;',
        'amp'      => '&#38;',
        'lt'       => '&#60;',
        'gt'       => '&#62;',
        'OElig'    => '&#338;',
        'oelig'    => '&#339;',
        'Scaron'   => '&#352;',
        'scaron'   => '&#353;',
        'Yuml'     => '&#376;',
        'circ'     => '&#710;',
        'tilde'    => '&#732;',
        'ensp'     => '&#8194;',
        'emsp'     => '&#8195;',
        'thinsp'   => '&#8201;',
        'zwnj'     => '&#8204;',
        'zwj'      => '&#8205;',
        'lrm'      => '&#8206;',
        'rlm'      => '&#8207;',
        'ndash'    => '&#8211;',
        'mdash'    => '&#8212;',
        'lsquo'    => '&#8216;',
        'rsquo'    => '&#8217;',
        'sbquo'    => '&#8218;',
        'ldquo'    => '&#8220;',
        'rdquo'    => '&#8221;',
        'bdquo'    => '&#8222;',
        'dagger'   => '&#8224;',
        'Dagger'   => '&#8225;',
        'permil'   => '&#8240;',
        'lsaquo'   => '&#8249;',
        'rsaquo'   => '&#8250;',
        'euro'     => '&#8364;',
        'fnof'     => '&#402;',
        'Alpha'    => '&#913;',
        'Beta'     => '&#914;',
        'Gamma'    => '&#915;',
        'Delta'    => '&#916;',
        'Epsilon'  => '&#917;',
        'Zeta'     => '&#918;',
        'Eta'      => '&#919;',
        'Theta'    => '&#920;',
        'Iota'     => '&#921;',
        'Kappa'    => '&#922;',
        'Lambda'   => '&#923;',
        'Mu'       => '&#924;',
        'Nu'       => '&#925;',
        'Xi'       => '&#926;',
        'Omicron'  => '&#927;',
        'Pi'       => '&#928;',
        'Rho'      => '&#929;',
        'Sigma'    => '&#931;',
        'Tau'      => '&#932;',
        'Upsilon'  => '&#933;',
        'Phi'      => '&#934;',
        'Chi'      => '&#935;',
        'Psi'      => '&#936;',
        'Omega'    => '&#937;',
        'alpha'    => '&#945;',
        'beta'     => '&#946;',
        'gamma'    => '&#947;',
        'delta'    => '&#948;',
        'epsilon'  => '&#949;',
        'zeta'     => '&#950;',
        'eta'      => '&#951;',
        'theta'    => '&#952;',
        'iota'     => '&#953;',
        'kappa'    => '&#954;',
        'lambda'   => '&#955;',
        'mu'       => '&#956;',
        'nu'       => '&#957;',
        'xi'       => '&#958;',
        'omicron'  => '&#959;',
        'pi'       => '&#960;',
        'rho'      => '&#961;',
        'sigmaf'   => '&#962;',
        'sigma'    => '&#963;',
        'tau'      => '&#964;',
        'upsilon'  => '&#965;',
        'phi'      => '&#966;',
        'chi'      => '&#967;',
        'psi'      => '&#968;',
        'omega'    => '&#969;',
        'thetasym' => '&#977;',
        'upsih'    => '&#978;',
        'piv'      => '&#982;',
        'bull'     => '&#8226;',
        'hellip'   => '&#8230;',
        'prime'    => '&#8242;',
        'Prime'    => '&#8243;',
        'oline'    => '&#8254;',
        'frasl'    => '&#8260;',
        'weierp'   => '&#8472;',
        'image'    => '&#8465;',
        'real'     => '&#8476;',
        'trade'    => '&#8482;',
        'alefsym'  => '&#8501;',
        'larr'     => '&#8592;',
        'uarr'     => '&#8593;',
        'rarr'     => '&#8594;',
        'darr'     => '&#8595;',
        'harr'     => '&#8596;',
        'crarr'    => '&#8629;',
        'lArr'     => '&#8656;',
        'uArr'     => '&#8657;',
        'rArr'     => '&#8658;',
        'dArr'     => '&#8659;',
        'hArr'     => '&#8660;',
        'forall'   => '&#8704;',
        'part'     => '&#8706;',
        'exist'    => '&#8707;',
        'empty'    => '&#8709;',
        'nabla'    => '&#8711;',
        'isin'     => '&#8712;',
        'notin'    => '&#8713;',
        'ni'       => '&#8715;',
        'prod'     => '&#8719;',
        'sum'      => '&#8721;',
        'minus'    => '&#8722;',
        'lowast'   => '&#8727;',
        'radic'    => '&#8730;',
        'prop'     => '&#8733;',
        'infin'    => '&#8734;',
        'ang'      => '&#8736;',
        'and'      => '&#8743;',
        'or'       => '&#8744;',
        'cap'      => '&#8745;',
        'cup'      => '&#8746;',
        'int'      => '&#8747;',
        'there4'   => '&#8756;',
        'sim'      => '&#8764;',
        'cong'     => '&#8773;',
        'asymp'    => '&#8776;',
        'ne'       => '&#8800;',
        'equiv'    => '&#8801;',
        'le'       => '&#8804;',
        'ge'       => '&#8805;',
        'sub'      => '&#8834;',
        'sup'      => '&#8835;',
        'nsub'     => '&#8836;',
        'sube'     => '&#8838;',
        'supe'     => '&#8839;',
        'oplus'    => '&#8853;',
        'otimes'   => '&#8855;',
        'perp'     => '&#8869;',
        'sdot'     => '&#8901;',
        'lceil'    => '&#8968;',
        'rceil'    => '&#8969;',
        'lfloor'   => '&#8970;',
        'rfloor'   => '&#8971;',
        'lang'     => '&#9001;',
        'rang'     => '&#9002;',
        'loz'      => '&#9674;',
        'spades'   => '&#9824;',
        'clubs'    => '&#9827;',
        'hearts'   => '&#9829;',
        'diams'    => '&#9830;',
        'nbsp'     => '&#160;',
        'iexcl'    => '&#161;',
        'cent'     => '&#162;',
        'pound'    => '&#163;',
        'curren'   => '&#164;',
        'yen'      => '&#165;',
        'brvbar'   => '&#166;',
        'sect'     => '&#167;',
        'uml'      => '&#168;',
        'copy'     => '&#169;',
        'ordf'     => '&#170;',
        'laquo'    => '&#171;',
        'not'      => '&#172;',
        'shy'      => '&#173;',
        'reg'      => '&#174;',
        'macr'     => '&#175;',
        'deg'      => '&#176;',
        'plusmn'   => '&#177;',
        'sup2'     => '&#178;',
        'sup3'     => '&#179;',
        'acute'    => '&#180;',
        'micro'    => '&#181;',
        'para'     => '&#182;',
        'middot'   => '&#183;',
        'cedil'    => '&#184;',
        'sup1'     => '&#185;',
        'ordm'     => '&#186;',
        'raquo'    => '&#187;',
        'frac14'   => '&#188;',
        'frac12'   => '&#189;',
        'frac34'   => '&#190;',
        'iquest'   => '&#191;',
        'Agrave'   => '&#192;',
        'Aacute'   => '&#193;',
        'Acirc'    => '&#194;',
        'Atilde'   => '&#195;',
        'Auml'     => '&#196;',
        'Aring'    => '&#197;',
        'AElig'    => '&#198;',
        'Ccedil'   => '&#199;',
        'Egrave'   => '&#200;',
        'Eacute'   => '&#201;',
        'Ecirc'    => '&#202;',
        'Euml'     => '&#203;',
        'Igrave'   => '&#204;',
        'Iacute'   => '&#205;',
        'Icirc'    => '&#206;',
        'Iuml'     => '&#207;',
        'ETH'      => '&#208;',
        'Ntilde'   => '&#209;',
        'Ograve'   => '&#210;',
        'Oacute'   => '&#211;',
        'Ocirc'    => '&#212;',
        'Otilde'   => '&#213;',
        'Ouml'     => '&#214;',
        'times'    => '&#215;',
        'Oslash'   => '&#216;',
        'Ugrave'   => '&#217;',
        'Uacute'   => '&#218;',
        'Ucirc'    => '&#219;',
        'Uuml'     => '&#220;',
        'Yacute'   => '&#221;',
        'THORN'    => '&#222;',
        'szlig'    => '&#223;',
        'agrave'   => '&#224;',
        'aacute'   => '&#225;',
        'acirc'    => '&#226;',
        'atilde'   => '&#227;',
        'auml'     => '&#228;',
        'aring'    => '&#229;',
        'aelig'    => '&#230;',
        'ccedil'   => '&#231;',
        'egrave'   => '&#232;',
        'eacute'   => '&#233;',
        'ecirc'    => '&#234;',
        'euml'     => '&#235;',
        'igrave'   => '&#236;',
        'iacute'   => '&#237;',
        'icirc'    => '&#238;',
        'iuml'     => '&#239;',
        'eth'      => '&#240;',
        'ntilde'   => '&#241;',
        'ograve'   => '&#242;',
        'oacute'   => '&#243;',
        'ocirc'    => '&#244;',
        'otilde'   => '&#245;',
        'ouml'     => '&#246;',
        'divide'   => '&#247;',
        'oslash'   => '&#248;',
        'ugrave'   => '&#249;',
        'uacute'   => '&#250;',
        'ucirc'    => '&#251;',
        'uuml'     => '&#252;',
        'yacute'   => '&#253;',
        'thorn'    => '&#254;',
        'yuml'     => '&#255;'
    );
    if (isset($table[$matches[1]])) {
        return $table[$matches[1]];
    }
    // else
    return $destroy ? '' : $matches[0];
}


function html_to_plaintext($string = '', $newlines = false, $remove_quotes = false) {
    $string = decode_entities_full(html_entity_decode($string), ENT_COMPAT, "utf-8");
    $string = preg_replace('/(<(script|style)\b[^>]*>).*?(<\/\2>)/is', "$1$3", $string);
    $string = strip_tags($string);

    // if we want to LEAVE newlines, to be outputted then as eg <br />
    $pattern = $newlines ? '/[[:blank:]]+/' : '/\s+/';

    $string = trim(preg_replace($pattern, ' ', $string));
    $string = $remove_quotes ? htmlspecialchars($string) : $string;

    return $string;
}

/**
 * @param string $short_description
 * @param int $string_length
 * @param bool $newlines If true, newlines will not be removed
 *
 * @return string
 */

function strip2words($short_description = '', $string_length = 200, $newlines = false) {
    $short_description = html_to_plaintext($short_description, $newlines);
    $str_prefix = '';
    $short_description = $str_prefix . (mb_strlen($short_description) > $string_length ?
            preg_replace('/\s+?(\S+)?$/', '',
                mb_substr($short_description, $first_appearance = 0, $string_length)) . '' :
            $short_description);
    return $short_description;
}

/**
 * @param string $val size in B K or M (like 8M)
 *
 * @return int
 * from: http://php.net/manual/en/function.ini-get.php#example-548
 */
function return_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $val = (double)trim(strtolower($val),$last);
    switch($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $val;
}

/*
 * To get the memory usage in KB or MB
 * http://php.net/manual/en/function.memory-get-usage.php#96280
 * */
function return_readable_bytes($size) {
    $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb');
    return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $unit[$i];
}

/*
 * To get the memory usage in KB or MB
 * http://php.net/manual/en/function.memory-get-usage.php#96280
 * */
function convert($size) {
    $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb');
    return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $unit[$i];
}

/*
    Convert MONEY to number. Taken from here: https://stackoverflow.com/a/19764699/1720476
*/

function getAmount($money) {
    $cleanString = preg_replace('/([^0-9\.,])/i', '', $money);
    $onlyNumbersString = preg_replace('/([^0-9])/i', '', $money);

    $separatorsCountToBeErased = strlen($cleanString) - strlen($onlyNumbersString) - 1;

    $stringWithCommaOrDot = preg_replace('/([,\.])/', '', $cleanString, $separatorsCountToBeErased);
    $removedThousendSeparator = preg_replace('/(\.|,)(?=[0-9]{3,}$)/', '', $stringWithCommaOrDot);

    return (float)str_replace(',', '.', $removedThousendSeparator);
}

// https://stackoverflow.com/questions/834303/startswith-and-endswith-functions-in-php
function endsWith($haystack, $needle) {
    return substr_compare($haystack, $needle, -strlen($needle)) === 0;
}
