<?php
/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
//
// +----------------------------------------------------------------------+
// | PHP version 4                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2006 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/3_0.txt.                                  |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Piotr Klaban <makler@man.torun.pl>                          |
// +----------------------------------------------------------------------+
//
// $Id: Words.php,v 1.4 2006/06/13 11:29:35 makler Exp $
//

/**
 * The Numbers_Words class provides method to convert arabic numerals to
 * words (also with currency name).
 *
 * @author Piotr Klaban <makler@man.torun.pl>
 * @package Numbers_Words
 */

// {{{ Numbers_Words

/**
 * The Numbers_Words class provides method to convert arabic numerals to words.
 *
 * @access public
 * @author Piotr Klaban <makler@man.torun.pl>
 * @since  PHP 4.2.3
 * @package Numbers_Words
 */
class Numbers_Words
{
    // {{{ toWords()

    /**
     * Converts a number to its word representation
     *
     * @param  integer $num   An integer between -infinity and infinity inclusive :)
     *                        that should be converted to a words representation
     *
     * @param  string  $locale Language name abbreviation. Optional. Defaults to en_US.
     *
     * @return string  The corresponding word representation
     *
     * @access public
     * @author Piotr Klaban <makler@man.torun.pl>
     * @since  PHP 4.2.3
     */
    function toWords($num, $locale = 'en_US') {

        include_once("Numbers/Words/lang.${locale}.php");

        $classname = "Numbers_Words_${locale}";

        if (!class_exists($classname)) {
            return Numbers_Words::raiseError("Unable to include the Numbers/Words/lang.${locale}.php file");
        }

        $methods = get_class_methods($classname);

        if (!in_array('toWords', $methods) && !in_array('towords', $methods)) {
            return Numbers_Words::raiseError("Unable to find toWords method in '$classname' class");
        }

        @$obj =& new $classname;

        return trim($obj->toWords($num));
    }
    // }}}
    // {{{ toCurrency()
    /**
     * Converts a currency value to word representation (1.02 => one dollar two cents)
     * If the number has not any fraction part, the "cents" number is omitted. 
     *
     * @param  float   $num   A float/integer/string number representing currency value
     *
     * @param  string  $locale Language name abbreviation. Optional. Defaults to en_US.
     *
     * @param  string  $int_curr International currency symbol
     *                 as defined by the ISO 4217 standard (three characters).
     *                 E.g. 'EUR', 'USD', 'PLN'. Optional.
     *                 Defaults to $def_currency defined in the language class.
     *
     * @return string  The corresponding word representation
     *
     * @access public
     * @author Piotr Klaban <makler@man.torun.pl>
     * @since  PHP 4.2.3
     */
    function toCurrency($num, $locale = 'en_US', $int_curr = '') {
        $ret = $num;

        @include_once("Numbers/Words/lang.${locale}.php");

        $classname = "Numbers_Words_${locale}";

        if (!class_exists($classname)) {
            return Numbers_Words::raiseError("Unable to include the Numbers/Words/lang.${locale}.php file");
        }

        $methods = get_class_methods($classname);

        if (!in_array('toCurrencyWords', $methods) && !in_array('tocurrencywords', $methods)) {
            return Numbers_Words::raiseError("Unable to find toCurrencyWords method in '$classname' class");
        }

        @$obj =& new $classname;

        if (strpos($num, '.') === false)
        {
          $ret      = trim($obj->toCurrencyWords($int_curr, $num));
        } else {
            $currency = explode('.', $num, 2);
            /* add leading zero */
            if (strlen($currency[1]) == 1) {
                $currency[1] .= '0';
            }
            $ret      = trim($obj->toCurrencyWords($int_curr, $currency[0], $currency[1]));
        }
        return $ret;
    }
    // }}}
    // {{{ getLocales()
    /**
     * Lists available locales for Numbers_Words
     *
     * @param  string  $int_curr International currency symbol
     * @param  mixed   string/array of strings $locale
     *                 Optional searched language name abbreviation.
     *                 Default: all available locales.
     *
     * @return array   The available locales (optionaly only the requested ones)
     * @author Piotr Klaban <makler@man.torun.pl>
     * @author Bertrand Gugger, bertrand at toggg dot com
     *
     * @access public
     * @static
     */
    function getLocales($locale = null) {
        $ret = array();
       	if (isset($locale) && is_string($locale)) {
       	    $locale = array($locale);
        }
        $dname = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Words' . DIRECTORY_SEPARATOR;
        $dh=opendir($dname);
        if ($dh) {
            while ($fname = readdir($dh)) {
                if (preg_match('#^lang\.([a-z_]+)\.php$#i', $fname, $matches)) {
                    if (is_file($dname . $fname) && is_readable($dname . $fname) &&
                        (!isset($locale) || in_array($matches[1], $locale))) {
                        $ret[] = $matches[1];
                    }
                }
            }
            closedir($dh);
            sort($ret);
        }
        return $ret;
    }
    // }}}
    // {{{ raiseError()
   /**
    * Trigger a PEAR error
    *
    * To improve performances, the PEAR.php file is included dynamically.
    *
    * @param string error message
    */
    function raiseError($msg)
    {
        include_once('PEAR.php');
        return PEAR::raiseError($msg);
    }
    // }}}
}

// }}}
?>
