File: /home/iestorre/biologia/modules/mod_weather_jclock/mod_weather_jclock_functions.php
<?php
/**
* @Copyright Copyright (c) 2010 M. Bollmann
* @license GNU/GPL http://www.gnu.org/copyleft/gpl.html
**/
// Weather J.Clock -Module
// Weather J.Clock creates a JavaScript digitalclock with weather display based on the globally available METAR weather data
//
// **************************************************************************
// Parts of the METAR-fetching Code by Vasco Nunes / INNATO BV from the great MambWeather Module
// Weather Icons by J. Correa - www.jcorrea.es
// **************************************************************************
defined( '_JEXEC' ) or die( 'Restricted access' );
function fetchmetar($metarcode,$cachezeit,$metar_mode)
{
$metar_cache= JPATH_SITE."/modules/mod_weather_jclock/".$metarcode."_cache.txt";
if (file_exists($metar_cache)) {
$cache_age=(time()-filemtime($metar_cache));
}
if (isset($cache_age) && $cache_age < $cachezeit && file_exists($metar_cache) && filesize($metar_cache)!=0)
{
$fp = @fopen($metar_cache, "r");
$metar = @fread($fp, filesize($metar_cache));
@fclose($fp);
} else
{
if (($metar_mode !== 'HTTP') AND ($metar_mode !== 'FTP'))
$metar_mode = 'HTTP';
if ($metar_mode == 'FTP') {
$requestor_url = substr(htmlspecialchars( JRoute::_($url) ),7);
$requestor_url = substr($requestor_url,0,strlen($requestor_url)-1);
$ftp_host = "tgftp.nws.noaa.gov";
$ftp_user = "anonymous";
$ftp_pass = $requestor_url;
$remote_file = "/data/observations/metar/stations/".$metarcode.".TXT";
$fp = @fopen($metar_cache, 'w');
@fclose($fp);
@unlink($metar_cache);
$conn_id = ftp_connect($ftp_host);
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
if ((!$conn_id) || (!$login_result))
exit;
if (!ftp_get($conn_id, $metar_cache, $remote_file, FTP_BINARY))
exit;
ftp_close($conn_id);
$fp = @fopen($metar_cache, "r");
$metar = @fread($fp, filesize($metar_cache));
@fclose($fp);
$metar = substr($metar, 17);
$fp = @fopen($metar_cache, "w");
@fwrite($fp, $metar);
@fclose($fp);
}
if ($metar_mode == 'HTTP') {
$host = 'weather.noaa.gov';
$location = "/pub/data/observations/metar/stations/$metarcode.TXT";
$request = "HTTP/1.1\r\n" .
"If-Modified-Since: Sat, 29 Oct 1994 09:00:00 GMT\r\n" .
"Pragma: no-cache\r\n".
"Cache-Control: no-cache\r\n";
@$fp = fsockopen($host, 80);
$request = "GET $location $request" .
"Host: $host\r\n" .
"Content-Type: text/html\r\n" .
"Connection: Close\r\n\r\n";
$metar = false;
if ($fp)
{
fputs($fp, $request);
if (strpos(fgets($fp, 1024), '200 '))
{
do
{
$line = fgets($fp, 1024);
} while ($line != "\r\n");
while ($line = fgets($fp, 1024))
{
$metar = $line;
}
fclose($fp);
}
}
if ($fp = fopen($metar_cache, "w"))
{
fwrite($fp, $metar);
fclose($fp);
}
}
}
return $metar;
}
function wcauswerten($metardata,$time) {
$ergebnis_metar =array();
$ergebnis_metar['himmel']['bild']= 'heiter.png';
$erscheinung = array ('#' => 'None',
'TS' => 'Thun',
'RA' => 'Rain',
'DZ' => 'Rain',
'SN' => 'Snow',
'SG' => 'Snow',
'GR' => 'Hail',
'GS' => 'Hail',
'PE' => 'Hail',
'IC' => 'Hail',
'BR' => 'Fog',
'FG' => 'Fog');
$bedeckung = array ('CLR' => '0',
'SKC' => '0',
'FEW' => '1',
'SCT' => '2',
'BKN' => '3',
'OVC' => '4',
'VV' => '4');
$imagesn = array ('None' => array ('0' => 'nsonne.png',
'1' => 'nsonne.png',
'2' => 'nheiter.png',
'3' => 'nbewolkt.png',
'4' => 'bedeckt.png'),
'-Rain' => array ('0' => 'nsonne.png',
'1' => 'leichtregen.png',
'2' => 'leichtregen.png',
'3' => 'leichtregen.png',
'4' => 'leichtregen.png'),
'Rain' => array ('0' => 'nsonne.png',
'1' => 'leichtregen.png',
'2' => 'leichtregen.png',
'3' => 'starkregen.png',
'4' => 'starkregen.png'),
'+Rain' => array ('0' => 'nsonne.png',
'1' => 'starkregen.png',
'2' => 'starkregen.png',
'3' => 'starkregen.png',
'4' => 'starkregen.png'),
'-Snow' => array ('0' => 'sonne.png',
'1' => 'schnee.png',
'2' => 'schnee.png',
'3' => 'schnee.png',
'4' => 'schnee.png'),
'+Snow' => array ('0' => 'nsonne.png',
'1' => 'schnee.png',
'2' => 'schnee.png',
'3' => 'schnee.png',
'4' => 'schnee.png'),
'-Hail' => array ('0' => 'nsonne.png',
'1' => 'hagel.png',
'2' => 'hagel.png',
'3' => 'hagel.png',
'4' => 'hagel.png'),
'+Hail' => array ('0' => 'nsonne.png',
'1' => 'hagel.png',
'2' => 'hagel.png',
'3' => 'hagel.png',
'4' => 'hagel.png'),
'Thun' => array ('0' => 'nsonne.png',
'1' => 'gewitter.png',
'2' => 'gewitter.png',
'3' => 'gewitter.png',
'4' => 'gewitter.png'),
'Fog' => array ('0' => 'nebel.png',
'1' => 'nebel.png',
'2' => 'nebel.png',
'3' => 'nebel.png',
'4' => 'nebel.png')
);
$images = array ('None' => array ('0' => 'sonne.png',
'1' => 'sonne.png',
'2' => 'heiter.png',
'3' => 'bewolkt.png',
'4' => 'bedeckt.png'),
'-Rain' => array ('0' => 'sonne.png',
'1' => 'leichtregen.png',
'2' => 'leichtregen.png',
'3' => 'leichtregen.png',
'4' => 'leichtregen.png'),
'Rain' => array ('0' => 'sonne.png',
'1' => 'leichtregen.png',
'2' => 'leichtregen.png',
'3' => 'starkregen.png',
'4' => 'starkregen.png'),
'+Rain' => array ('0' => 'sonne.png',
'1' => 'starkregen.png',
'2' => 'starkregen.png',
'3' => 'starkregen.png',
'4' => 'starkregen.png'),
'-Snow' => array ('0' => 'sonne.png',
'1' => 'schnee.png',
'2' => 'schnee.png',
'3' => 'schnee.png',
'4' => 'schnee.png'),
'+Snow' => array ('0' => 'sonne.png',
'1' => 'schnee.png',
'2' => 'schnee.png',
'3' => 'schnee.png',
'4' => 'schnee.png'),
'-Hail' => array ('0' => 'sonne.png',
'1' => 'hagel.png',
'2' => 'hagel.png',
'3' => 'hagel.png',
'4' => 'hagel.png'),
'+Hail' => array ('0' => 'sonne.png',
'1' => 'hagel.png',
'2' => 'hagel.png',
'3' => 'hagel.png',
'4' => 'hagel.png'),
'Thun' => array ('0' => 'sonne.png',
'1' => 'gewitter.png',
'2' => 'gewitter.png',
'3' => 'gewitter.png',
'4' => 'gewitter.png'),
'Fog' => array ('0' => 'nebel.png',
'1' => 'nebel.png',
'2' => 'nebel.png',
'3' => 'nebel.png',
'4' => 'nebel.png')
);
$maxbedeckung = 0;
$night = 0;
$local_time = 12;
$parts = explode(' ', $metardata);
$num_parts = count($parts);
for ($i = 0; $i < $num_parts; $i++) {
$part = $parts[$i];
if (preg_match('/RMK|TEMPO|BECMG|INTER/', $part)) {
for($j=$i;$j<$num_parts; $j++)
$ergebnis_metar['remarks'] .= ' ' . $parts[$j];
$ergebnis_metar['remarks'] = trim($ergebnis_metar['remarks']);
break;
} elseif (preg_match('#^(M?[0-9]{2})/(M?[0-9]{2}|//)?$#', $part, $regs)) {
$ergebnis_metar['temperature']['temp_c'] =
round((strtr($regs[1], 'M', '-')),1);
$ergebnis_metar['temperature']['temp_f'] =
round((strtr($regs[1], 'M', '-') * (9/5) + 32),1);
} elseif (preg_match('/^T([0-9]{4})([0-9]{4})/', $part, $regs)) {
temperaturspeichern($regs[1] / 10,
$ergebnis_metar['temperature']['temp_c'],
$ergebnis_metar['temperature']['temp_f']);
} elseif (preg_match('#^T([0-9]{4}$)#', $part, $regs)) {
temperaturspeichern($regs[1],
$ergebnis_metar['temperature']['temp_c'],
$ergebnis_metar['temperature']['temp_f']);
}
elseif (preg_match('/([0-9]{2})([0-9]{2})([0-9]{2})Z/', $part, $regs)) {
$local_time = $regs[2]+ $time;
if ($local_time < 0) {
$local_time += 24;
}
elseif ($local_time >= 24) {
$local_time -= 24;
}
if (($local_time < 5) || ($local_time >= 18)) {
$night = 1;
}
}
elseif (preg_match('/^(-|\+|VC)?(TS|SH|FZ|BL|DR|MI|BC|PR|RA|DZ|SN|SG|GR|GS|PE|IC|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS)+$/', $part)) {
$intensity = '';
if (preg_match('/^(-|\+|VC)(..)*$/',$part)) {
if ($part[0] == '-') {
$intensity = '-';
$part = substr($part,1);
} elseif ($part[0] == '+') {
$intensity = '+';
$part = substr($part,1);
} elseif ($part[0] . $part[1] == 'VC') {
$intensity = '';
$part = substr($part,2);
}
}
preg_match('/(TS|RA|DZ|SN|SG|GR|GS|PE|IC|BR|FG)(..)*$/',$part,$match);
if (!empty($match[1])) {
$erscheinungen = $match[1];
} else {
preg_match('/(..)(TS|RA|DZ|SN|SG|GR|GS|PE|IC|BR|FG)(..)*$/',$part,$match);
if (!empty($match[2])) {
$erscheinungen = $match[2];
} else {
$erscheinungen = '#';
}
}
if (preg_match('/^(Snow|Hail)$/',$erscheinung[$erscheinungen])) {
if ($intensity == '') {
$intensity = '-';
}
}
if (preg_match('/^(Rain|Snow|Hail)$/',$erscheinung[$erscheinungen])) {
$erscheinungen_group = $intensity.$erscheinung[$erscheinungen];
} else {
$erscheinungen_group = $erscheinung[$erscheinungen];
}
}
elseif (preg_match('/(SKC|CLR)(...)/', $part, $regs)) {
$maxbedeckung = max($maxbedeckung,$bedeckung[$regs[1]]);
}
elseif (preg_match('/^(VV|FEW|SCT|BKN|OVC)([0-9]{3})(CB|TCU)?$/', $part, $regs)) {
$maxbedeckung = max($maxbedeckung,$bedeckung[$regs[1]]);
}
}
if (empty($erscheinungen)) {
$erscheinungen = '#';
$erscheinungen_group = $erscheinung[$erscheinungen];
}
if ($night == 1) {
$ergebnis_metar['himmel']['bild']= $imagesn[$erscheinungen_group][$maxbedeckung];
} else {
$ergebnis_metar['himmel']['bild']= $images[$erscheinungen_group][$maxbedeckung];
}
return $ergebnis_metar;
}
function temperaturspeichern($temp, &$temp_c, &$temp_f) {
if ($temp[0] == 1) {
$temp[0] = '-';
}
$temp_c = number_format($temp,1);
$temp_f = number_format($temp * (9/5) + 32,1);
}
?>