<?php
/**
*   Gets currency rates data from Bank of Estonia - http://www.eestipank.info
*   relative to Estonian crown.
*
*   Usage:
*   <code>
*   <?php
*   $params = array(
*        'date'     => date
*        'currency' => currency,
*        'to_float' => boolean
*        );
*   Rates::value($params);
*   ?>
*   </code>
*
*   @author Dmitri Smirnov <smirnov.dmitri@gmail.com>, http://www.dmitri.me
*/
class Money_Rates {
    
    
/**
    *   @var string
    */
    
private static $cache;
    
    
/**
    *   Reads the data from Bank of Estonia server.
    *   @param string
    *   @params string
    *   @param boolean
    *
    *   @return mixed 
    */
    
private function getData($date ''$currency ''$to_float false) {
        if(
$date) {
            
$date  split('\.'$date);
            
$day   $date[0];
            
$month $date[1];
            
$year  $date[2];
        } else {
            
$day   date('d');
            
$month date('m');
            
$year  date('Y');
        }
        
settype($day,   'integer');
        
        
//if unkwnow currency exit
        
$currency strtoupper($currency);
        if(!
preg_match(
            
'/^(AED|ARS|AZN|AUD|BGN|BRL|BYR|CAD|CHF|CNY|CZK|DKK|EGP|EUR|
            GBP|GEL|HKD|HRK|HUF|IDR|ILS|INR|ISK|JPY|KGS|KRW|KZT|LTL|LVL|
            MAD|MDL|MXN|MYR|NOK|NZD|PLN|RON|RSD|RUB|SDR|SEK|SGD|SKK|ZAR|
            THB|TND|TRY|TWD|UAH|USD|UZS|VEF|XAU|XOF)$/i'
,
            
$currency) && $currency) {
            exit(
'Unknown currency index: ' $currency);
        }
        
        
//Do while found last date with data, becuase updates comes later
        // (13:00 EET)
        //if there is already cache, don't make a new request
        
if(!self::$cache) {
            
$day += 1;
            do {
                
$day--;
                
$url  'http://www.eestipank.info/dynamic/erp/erp_csv.jsp';
                
$path 
                  
sprintf('?type=4&day=%s&month=%s&year=%s'$day$month$year);
                
$contents file($url $path);
            } while(
count($contents) <= 3);
        
        
            
$retval = array();
            for(
$i 1$i count($contents) - 2$i++) {
                
$data split(';'$contents[$i]);
                
$data[0] = str_replace("\""''$data[0]);
                
$data[1] = str_replace("\""''$data[1]);
                
$data[1] = str_replace(',''.'$data[1]);
                
$data[1] = str_replace(chr(160), '',  $data[1]); 

                if(
$to_float) {
                    
settype($data[1], 'float');
                }
                
$retval[$data[0]] = $data[1];
            }
            
            
self::cacheData($retval);
        } else {
            
$retval self::$cache;
        }
        
        if(
$currency) {
            return 
$retval[$currency];
        }
        
        return 
$retval;
    }
    
    
/**
    *   Cache data for making only one request
    *
    *   @param string
    */
    
private function cacheData($data) {
        
self::$cache $data;
    }
    
    
/**
    *   Factory method for getting specified value. Set parameter as string
    *   to get specific currency or as an array with additional options:
    *
    *   * currency -- specific currency, if not set will return array with all
    *   currencies
    *   * date -- data for date (Do not use old dates estonian archeve keeps
    *    them about for a year).
    *   * to_float -- cunvert date to float numbers
    *
    *   @param string|array
    *
    *   @return mixed
    */
    
public static function factory($params) {
        if(!
is_string($params) && !is_array($params)) {
            throw new 
Exception('Parameter should be a string or array');
        }
        if(
is_array($params)) {
            
$currency = @$params['currency'];
            
$date     = @$params['date'];
            
$to_float = @$params['to_float'];
        }
        if(
is_string($params)) {
            
$date     '';
            
$currency $params;
            
$to_float false;
        }
        
        return 
self::getData($date$currency$to_float);
    }
}

?>