+<?php\r
+/*\r
+ yr.php - YR.no forecast on YOUR page!\r
+ \r
+ This script was downloaded from http://www.yr.no/verdata/1.5542682\r
+ Please read the tips on that page on how you would/should use this script\r
+\r
+ You need a webserver with PHP version 5 or later to run this script.\r
+ A lot of comments are in Norwegian only. We will be translating to english whenever we have the opportunity.\r
+ For feedback / bug repports / feature requests, please contact: Lennart André Rolland <lennart.andre.rolland@nrk.no>\r
+\r
+ ###### Changelog\r
+\r
+ Versjon: 2.6 - Lennart André Rolland (lennart.andre.rolland@nrk.no) / NRK - 2008.11.11 11:48\r
+ * Added option to remove banner ($yr_use_banner)\r
+ * Added option to allow any target for yr.no urls ($yr_link_target)\r
+\r
+ Versjon: 2.5 - Lennart André Rolland (lennart.andre.rolland@nrk.no) / NRK - 2008.09.25 09:24\r
+ * Cache will now update on parameter changes (cache file is prefixed with md5 digest of all relevant parameters)\r
+ This change will in the future make it easier to use the script for multiple locations in one go. \r
+ * Most relevant comments translated to english\r
+\r
+ Versjon 2.4 - Sven-Ove Bjerkan (sven-ove@smart-media.no) / Smart-Media AS - 2008.10.22 12:14\r
+ * Endret funksjonalitet ifbm med visning av PHP-feil (fjernet blant annet alle "@", dette styres av error_reporting())\r
+ * Ved feilmelding så ble denne lagret i lokal cache slik at man fikk opp feilmld hver gang inntil "$yr_maxage" inntreffer og den forsøker å laste på nytt - den cacher nå ikke hvis det oppstår en feil\r
+ * $yr_use_text, $yr_use_links og $yr_use_table ble overstyrt til "true" uavhengig av brukerens innstilling - rettet!\r
+\r
+ Versjon: 2.3 - Lennart André Rolland (lennart.andre.rolland@nrk.no) / NRK - 2008.09.25 09:24\r
+ * File permissions updated\r
+ * Caching is stored in HTML isntead of XML for security\r
+ * Other security and efficiency improvements\r
+\r
+\r
+\r
+ ###### INSTRUCTIONS:\r
+\r
+ 1. Only edit this script in editors with ISO-8859-1 or ISO-8859-15 character set.\r
+ 2. Edit the settings below\r
+ 3. Transfer the script to a folder in your webroot.\r
+ 4. Make sure that the webserver has write access to the folder where thsi script is placed. It will create a folder called yr-cache and place cached HTML data in that directory.\r
+\r
+ */\r
+\r
+/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /\r
+/// /// /// /// /// Settings /// /// /// /// /// /// /// /// //\r
+// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///\r
+\r
+// 1. Lenke: Lenke til stedet på yr.no (Uten siste skråstrek. Bruk vanlig æøå i lenka )\r
+// Link: Link to the url for the location on yr.no (Without the last Slash.)\r
+$yr_url='http://www.yr.no/sted/Norge/Vest-Agder/Lyngdal/Kvås';\r
+$yr_url='http://www.yr.no/stad/Sverige/Jämtland/Lofsdalen';\r
+\r
+// 2. Stedsnavnet: Skriv inn navnet på stedet. La stå tom for å falle tilbake til navnet i lenken\r
+// Location: The name of the location. Leave empty to fallback to the location in the url.\r
+$yr_name='';\r
+\r
+// 3. Bruk header og footer: Velg om du vil ha med header og/eller footer\r
+// Use Header and footers: Select to have HTML headers/footers wrapping the content (useful for debugging)\r
+//PS: Header for HTML dokumentet er XHTML 1.0 Strict\r
+// Skrus som regel av når du inlemmer i eksisterende dokument!\r
+//\r
+$yr_use_header=$yr_use_footer=true;\r
+\r
+// 4. Deler: Velg delene av varselet du vil ta med!\r
+// Parts: Choose which parts of the forecast to include\r
+$yr_use_banner=true; //yr.no Banner\r
+$yr_use_text=false; //Tekstvarsel\r
+$yr_use_links=true; //Lenker til varsel på yr.no\r
+$yr_use_table=true; //Tabellen med varselet\r
+\r
+// 5. Mellomlagringstid: Antall sekunder før nytt varsel hentes fra yr.no.\r
+// Cachetime: Number of seconds to keep forecast in local cache\r
+// Den anbefalt verdien på 1200 vil oppdatere siden hver 20. minutt.\r
+//\r
+// PS: Vi ønsker at du setter 20 minutters mellomlagringstid fordi\r
+// det vil gi høyere ytelse, både for yr.no og deg! MEN for å få til dette\r
+// vil vi opprette en mappe og lagre en fil i denne mappen. Vi har gått\r
+// gjennom scriptet veldig nøye for å forsikre oss om at det er feilfritt.\r
+// Likevel er dette ikke helt uproblematisk i forhold til sikkerhet.\r
+// Hvis du har problemer med dette kan du sette $yr_maxage til 0 for å skru\r
+// av mellomlagringen helt!\r
+$yr_maxage=1200;\r
+\r
+// 6. Utløpstid: Denne instillingen lar deg velge hvor lenge yr.no har på å\r
+// levere varselet i sekunder.\r
+// Timeout: How long before this script gives up fetching data from yr.no\r
+//\r
+// Hvis yr.no skulle være nede eller det er\r
+// forstyrrelser i båndbredden ellers, vil varselet erstattes med en\r
+// feilmelding til situasjonen er bedret igjen. PS: gjelder kun når nytt\r
+// varsel hentes! Påvirker ikke varsel mens siden viser varsel fra\r
+// mellomlageret. Den anbefalte verdien på 10 sekunder fungerer bra.\r
+$yr_timeout=10;\r
+\r
+// 7. Mellomlagrinsmappe: Velg navn på mappen til mellomlagret data.\r
+// Cachefolder: Where to put cache data\r
+//\r
+//Dette scriptet vil forsøke å opprette mappen om den ikke finnes.\r
+$yr_datadir='yr_cache';\r
+\r
+\r
+// 8. Lenke mål: Velg hvilken target som skal brukes på lenker til yr.no\r
+// Link target: Choose which target to use for links to yr.no\r
+$yr_link_target='_top';\r
+\r
+// 9. Vis feilmeldinger: Sett til "true" hvis du vil ha feilmeldinger.\r
+// Show errors: Useful while debugging.\r
+//\r
+//greit ved feilsøking, men bør ikke være aktivert i drift.\r
+$yr_vis_php_feilmeldinger=true;\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /\r
+/// /// /// /// /// Code /// /// /// /// /// /// /// /// /// //\r
+// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///\r
+// Skru på feilmeldinger i starten\r
+if($yr_vis_php_feilmeldinger) {\r
+ error_reporting(E_ALL);\r
+ ini_set('display_errors', true);\r
+}\r
+else {\r
+ error_reporting(0);\r
+ ini_set('display_errors', false);\r
+}\r
+\r
+//Opprett en komunikasjon med yr\r
+$yr_xmlparse = &new YRComms();\r
+//Opprett en presentasjon\r
+$yr_xmldisplay = &new YRDisplay();\r
+\r
+$yr_try_curl=true;\r
+\r
+//Gjenomfør oppdraget basta bom.\r
+die($yr_xmldisplay->generateHTMLCached($yr_url, $yr_name, $yr_xmlparse, $yr_url, $yr_try_curl, $yr_use_header, $yr_use_footer, $yr_use_banner, $yr_use_text, $yr_use_links, $yr_use_table, $yr_maxage, $yr_timeout, $yr_link_target));\r
+\r
+\r
+/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /\r
+/// /// /// /// /// Hjelpekode starter her /// /// /// /// /// //\r
+// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///\r
+\r
+\r
+function retar($array, $html = false, $level = 0) {\r
+ if(is_array($array)){\r
+ $space = $html ? " " : " ";\r
+ $newline = $html ? "<br />" : "\n";\r
+ $spaces='';\r
+ for ($i = 1; $i <= 3; $i++)$spaces .= $space;\r
+ $tabs=$spaces;\r
+ for ($i = 1; $i <= $level; $i++)$tabs .= $spaces;\r
+ $output = "Array(" . $newline . $newline;\r
+ $cnt=sizeof($array);\r
+ $j=0;\r
+ foreach($array as $key => $value) {\r
+ $j++;\r
+ if (is_array($value)) {\r
+ $level++;\r
+ $value = retar($value, $html, $level);\r
+ $level--;\r
+ }\r
+ else $value="'$value'";\r
+ $output .= "$tabs'$key'=> $value";\r
+ if($j<$cnt)$output .= ',';\r
+ $output .= $newline;\r
+ }\r
+ $output.=$tabs.')'.$newline;\r
+ }\r
+ else{\r
+ $output="'$array'";\r
+ }\r
+ return $output;\r
+}\r
+\r
+\r
+// Klasse for lesing og tilrettelegging av YR data\r
+class YRComms{\r
+\r
+ //Generer gyldig yr.no array med værdata byttet ut med en enkel feilmelding\r
+ private function getYrDataErrorMessage($msg="Feil"){\r
+ return Array(\r
+ '0'=> Array('tag'=> 'WEATHERDATA','type'=> 'open','level'=> '1'),\r
+ '1'=> Array('tag'=> 'LOCATION','type'=> 'open','level'=> '2'),\r
+ '2'=> Array('tag'=> 'NAME','type'=> 'complete','level'=> '3','value'=> $msg),\r
+ '3'=> Array('tag'=> 'LOCATION','type'=> 'complete','level'=> '3'),\r
+ '4'=> Array( 'tag'=> 'LOCATION', 'type'=> 'close', 'level'=> '2'),\r
+ '5'=> Array( 'tag'=> 'FORECAST', 'type'=> 'open', 'level'=> '2'),\r
+ '6'=> Array( 'tag'=> 'ERROR', 'type'=> 'complete', 'level'=> '3', 'value'=> $msg),\r
+ '7'=> Array( 'tag'=> 'FORECAST', 'type'=> 'close', 'level'=> '2'),\r
+ '8'=> Array( 'tag'=> 'WEATHERDATA', 'type'=> 'close', 'level'=> '1')\r
+ );\r
+ }\r
+\r
+ //Generer gyldig yr.no XML med værdata byttet ut med en enkel feilmelding\r
+ private function getYrXMLErrorMessage($msg="Feil"){\r
+ $msg=$this->getXMLEntities($msg);\r
+ //die('errmsg:'.$msg);\r
+ $data=<<<EOT\r
+<weatherdata>\r
+ <location />\r
+ <forecast>\r
+ <error>$msg</error>\r
+ <text>\r
+ <location />\r
+ </text>\r
+ </forecast>\r
+</weatherdata>\r
+\r
+EOT\r
+ ;\r
+ //die($data);\r
+ return $data;\r
+ }\r
+ \r
+ // Sørger for å laste ned XML fra yr.no og leverer data tilbake i en streng\r
+ private function loadXMLData($xml_url,$try_curl=true,$timeout=10){\r
+ global $yr_datadir;\r
+ $xml_url.='/varsel.xml';\r
+ // Lag en timeout på contexten\r
+ $ctx = stream_context_create(array( 'http' => array('timeout' => $timeout)));\r
+\r
+ // Prøv å åpne direkte først\r
+ //NOTE: This will spew ugly errors even when they are handled later. There is no way to avoid this but prefixing with @ (slow) or turning off error reporting\r
+ $data=file_get_contents($xml_url,0,$ctx);\r
+\r
+ if(false!=$data){\r
+ //Jippi vi klarte det med vanlig fopen url wrappers!\r
+ }\r
+ // Vanlig fopen_wrapper feilet, men vi har cURL tilgjengelig\r
+ else if($try_curl && function_exists('curl_init')){\r
+ $lokal_xml_url = $yr_datadir .'/curl.temp.xml';\r
+ $data='';\r
+ $ch = curl_init($xml_url);\r
+ // Åpne den lokale temp filen for skrive tilgang (med cURL hooks enablet)\r
+ $fp = fopen($lokal_xml_url, "w");\r
+ // Last fra yr.no til lokal kopi med curl\r
+ curl_setopt($ch, CURLOPT_FILE, $fp);\r
+ curl_setopt($ch, CURLOPT_HEADER, 0);\r
+ curl_setopt($ch, CURLOPT_POSTFIELDS, '');\r
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);\r
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);\r
+ curl_exec($ch);\r
+ curl_close($ch);\r
+ // Lukk lokal kopi\r
+ fclose($fp);\r
+ // Åpne lokal kopi igjen og les in alt innholdet\r
+ $data=file_get_contents($lokal_xml_url,0,$ctx);\r
+ //Slett temp data\r
+ unlink($lokal_xml_url);\r
+ // Sjekk for feil\r
+ if(false==$data)$data=$this->getYrXMLErrorMessage('Det oppstod en feil mens værdata ble lest fra yr.no. Teknisk info: Mest antakelig: kobling feilet. Nest mest antakelig: Det mangler støtte for fopen wrapper, og cURL feilet også. Minst antakelig: cURL har ikke rettigheter til å lagre temp.xml');\r
+ }\r
+ // Vi har verken fopen_wrappers eller cURL\r
+ else{\r
+ $data=$this->getYrXMLErrorMessage('Det oppstod en feil mens værdata ble forsøkt lest fra yr.no. Teknisk info: Denne PHP-installasjon har verken URL enablede fopen_wrappers eller cURL. Dette gjør det umulig å hente ned værdata. Se imiddlertid følgende dokumentasjon: http://no.php.net/manual/en/wrappers.php, http://no.php.net/manual/en/book.curl.php');\r
+ //die('<pre>LO:'.retar($data));\r
+ }\r
+ //die('<pre>XML for:'.$xml_url.' WAS: '.$data);\r
+ // Når vi har kommet hit er det noe som tyder på at vi har lykkes med å laste værdata, ller i det minste lage en teilmelding som beskriver eventuelle problemer\r
+ return $data;\r
+ }\r
+\r
+ // Last XML til en array struktur\r
+ private function parseXMLIntoStruct($data){\r
+ global $yr_datadir;\r
+ $parser = xml_parser_create('ISO-8859-1');\r
+ if((0==$parser)||(FALSE==$parser))return $this->getYrDataErrorMessage('Det oppstod en feil mens værdata ble forsøkt hentet fra yr.no. Teknisk info: Kunne ikke lage XML parseren.');\r
+ $vals = array();\r
+ //die('<pre>'.retar($data).'</pre>');\r
+ if(FALSE==xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1))return $this->getYrDataErrorMessage('Det oppstod en feil mens værdata ble forsøkt hentet fra yr.no. Teknisk info: Kunne ikke stille inn XML-parseren.');\r
+ if(0==xml_parse_into_struct($parser, $data, $vals, $index))return $this->getYrDataErrorMessage('Det oppstod en feil mens værdata ble forsøkt hentet fra yr.no. Teknisk info: Parsing av XML feilet.');\r
+ if(FALSE==xml_parser_free($parser))return $this->getYrDataErrorMessage('Det oppstod en feil mens værdata ble forsøkt hentet fra yr.no. Kunne ikke frigjøre XML-parseren.');\r
+ //die('<pre>'.retar($vals).'</pre>');\r
+ return $vals;\r
+ }\r
+\r
+\r
+ // Rense tekst data (av sikkerhetshensyn)\r
+ private function sanitizeString($in){\r
+ //return $in;\r
+ if(is_array($in))return $in;\r
+ if(null==$in)return null;\r
+ return htmlentities(strip_tags($in));\r
+ }\r
+\r
+ // Rense tekst data (av sikkerhetshensyn)\r
+ public function reviveSafeTags($in){\r
+ //$in=$in.'<strong>STRONG</strong> <u>UNDERLINE</u> <b>BOLD</b> <i>ITALICS</i>';\r
+ return str_ireplace(array('<strong>','</strong>','<u>','</u>','<b>','</b>','<i>','</i>'),array('<strong>','</strong>','<u>','</u>','<b>','</b>','<i>','</i>'),$in);\r
+ }\r
+\r
+\r
+\r
+ private function rearrangeChildren($vals, &$i) {\r
+ $children = array(); // Contains node data\r
+ // Sikkerhet: sørg for at all data som parses strippes for farlige ting\r
+ if (isset($vals[$i]['value']))$children['VALUE'] = $this->sanitizeString($vals[$i]['value']);\r
+ while (++$i < count($vals)){\r
+ // Sikkerhet: sørg for at all data som parses strippes for farlige ting\r
+ if(isset($vals[$i]['value']))$val=$this->sanitizeString($vals[$i]['value']);\r
+ else unset($val);\r
+ if(isset($vals[$i]['type']))$typ=$this->sanitizeString($vals[$i]['type']);\r
+ else unset($typ);\r
+ if(isset($vals[$i]['attributes']))$atr=$this->sanitizeString($vals[$i]['attributes']);\r
+ else unset($atr);\r
+ if(isset($vals[$i]['tag']))$tag=$this->sanitizeString($vals[$i]['tag']);\r
+ else unset($tag);\r
+ // Fyll inn strukturen vær slik vi vil ha den\r
+ switch ($vals[$i]['type']){\r
+ case 'cdata': $children['VALUE']=(isset($children['VALUE']))?$val:$children['VALUE'].$val; break;\r
+ case 'complete':\r
+ if (isset($atr)) {\r
+ $children[$tag][]['ATTRIBUTES'] = $atr;\r
+ $index = count($children[$tag])-1;\r
+ if (isset($val))$children[$tag][$index]['VALUE'] = $val;\r
+ else $children[$tag][$index]['VALUE'] = '';\r
+ } else {\r
+ if (isset($val))$children[$tag][]['VALUE'] = $val;\r
+ else $children[$tag][]['VALUE'] = '';\r
+ }\r
+ break;\r
+ case 'open':\r
+ if (isset($atr)) {\r
+ $children[$tag][]['ATTRIBUTES'] = $atr;\r
+ $index = count($children[$tag])-1;\r
+ $children[$tag][$index] = array_merge($children[$tag][$index],$this->rearrangeChildren($vals, $i));\r
+ } else $children[$tag][] = $this->rearrangeChildren($vals, $i);\r
+ break;\r
+ case 'close': return $children;\r
+ }\r
+ }\r
+ }\r
+ // Ommøbler data til å passe vårt formål, og returner\r
+ private function rearrangeDataStruct($vals){\r
+ //die('<pre>'.$this->retar($vals).'<\pre>');\r
+ $tree = array();\r
+ $i = 0;\r
+ if (isset($vals[$i]['attributes'])) {\r
+ $tree[$vals[$i]['tag']][]['ATTRIBUTES']=$vals[$i]['attributes'];\r
+ $index=count($tree[$vals[$i]['tag']])-1;\r
+ $tree[$vals[$i]['tag']][$index]=array_merge($tree[$vals[$i]['tag']][$index], $this->rearrangeChildren($vals, $i));\r
+ } else $tree[$vals[$i]['tag']][] = $this->rearrangeChildren($vals, $i);\r
+ //die("<pre>".retar($tree));\r
+ //Hent ut det vi bryr oss om\r
+ if(isset($tree['WEATHERDATA'][0]['FORECAST'][0]))return $tree['WEATHERDATA'][0]['FORECAST'][0];\r
+ else return YrComms::getYrDataErrorMessage('Det oppstod en feil ved behandling av data fra yr.no. Vennligst gjør administrator oppmerksom på dette! Teknisk: data har feil format.');\r
+ }\r
+\r
+ // Hovedmetode. Laster XML fra en yr.no URI og parser denne\r
+ public function getXMLTree($xml_url, $try_curl, $timeout){\r
+ // Last inn XML fil og parse til et array hierarcki, ommøbler data til å passe vårt formål, og returner\r
+ return $this->rearrangeDataStruct($this->parseXMLIntoStruct($this->loadXMLData($xml_url,$try_curl,$timeout)));\r
+ }\r
+\r
+ // Statisk hjelper for å parse ut tid i yr format\r
+ public function parseTime($yr_time, $do24_00=false){\r
+ $yr_time=str_replace(":00:00", "", $yr_time);\r
+ if($do24_00)$yr_time=str_replace("00", "24", $yr_time);\r
+ return $yr_time;\r
+ }\r
+\r
+ // Statisk hjelper for å besørge riktig encoding ved å oversette spesielle ISO-8859-1 karakterer til HTML/XHTML entiteter\r
+ public function convertEncodingEntities($yrraw){\r
+ $conv=str_replace("æ", "æ", $yrraw);\r
+ $conv=str_replace("ø", "ø", $conv);\r
+ $conv=str_replace("å", "å", $conv);\r
+ $conv=str_replace("Æ", "Æ", $conv);\r
+ $conv=str_replace("Ø", "Ø", $conv);\r
+ $conv=str_replace("Å", "Å", $conv);\r
+ return $conv;\r
+ }\r
+\r
+ // Statisk hjelper for å besørge riktig encoding vedå oversette spesielle UTF karakterer til ISO-8859-1\r
+ public function convertEncodingUTF($yrraw){\r
+ $conv=str_replace("æ", "æ", $yrraw);\r
+ $conv=str_replace("ø", "ø", $conv);\r
+ $conv=str_replace("Ã¥", "å", $conv);\r
+ $conv=str_replace("Ã\86", "Æ", $conv);\r
+ $conv=str_replace("Ã\98", "Ø", $conv);\r
+ $conv=str_replace("Ã\85", "Å", $conv);\r
+ return $conv;\r
+ }\r
+\r
+\r
+ public function getXMLEntities($string){\r
+ return preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '$this->_privateXMLEntities("$0")', $string);\r
+ }\r
+\r
+ private function _privateXMLEntities($num){\r
+ $chars = array(\r
+ 128 => '€', 130 => '‚',\r
+ 131 => 'ƒ', 132 => '„',\r
+ 133 => '…', 134 => '†',\r
+ 135 => '‡',136 => 'ˆ',\r
+ 137 => '‰',138 => 'Š',\r
+ 139 => '‹',140 => 'Œ',\r
+ 142 => 'Ž', 145 => '‘',\r
+ 146 => '’',147 => '“',\r
+ 148 => '”',149 => '•',\r
+ 150 => '–',151 => '—',\r
+ 152 => '˜',153 => '™',\r
+ 154 => 'š',155 => '›',\r
+ 156 => 'œ',158 => 'ž',\r
+ 159 => 'Ÿ');\r
+ $num = ord($num);\r
+ return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );\r
+ }\r
+}\r
+\r
+// Klasse for å vise data fra yr. Kompatibel med YRComms sin datastruktur\r
+class YRDisplay{\r
+\r
+ // Akkumulator variabl for å holde på generert HTML\r
+ var $ht='';\r
+ // Yr Url\r
+ var $yr_url='';\r
+ // Yr stedsnavn\r
+ var $yr_name='';\r
+ // Yr data\r
+ var $yr_data=Array();\r
+\r
+ //Filename for cached HTML. MD5 hash will be prepended to allow caching of several pages\r
+ var $datafile='yr.html';\r
+ //The complete path to the cache file\r
+ var $datapath='';\r
+\r
+ // Norsk grovinndeling av de 360 grader vindretning\r
+ var $yr_vindrettninger=array(\r
+ 'nord','nord-nordøst','nordøst','øst-nordøst',\r
+ 'øst','øst-sørøst','sørøst','sør-sørøst',\r
+ 'sør','sør-sørvest', 'sørvest','vest-sørvest',\r
+ 'vest', 'vest-nordvest','nordvest', 'nord-nordvest', 'nord');\r
+\r
+ // Hvor hentes bilder til symboler fra?\r
+ var $yr_imgpath='http://fil.nrk.no/yr/grafikk/sym/b38';\r
+\r
+\r
+ //Generer header for varselet\r
+ public function getHeader($use_full_html){\r
+ // Her kan du endre header til hva du vil. NB! Husk å skru det på, ved å endre instillingene i toppen av dokumentet\r
+ if($use_full_html){\r
+ $this->ht.=<<<EOT\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+ <head>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
+ <title>Værvarsel fra yr.no</title>\r
+ <link href="http://www12.nrk.no/yr.no/yr-php.css" rel="stylesheet" type="text/css" />\r
+ </head>\r
+ <body>\r
+\r
+EOT\r
+ ;\r
+ }\r
+ $this->ht.=<<<EOT\r
+ <div id="yr-varsel">\r
+\r
+EOT\r
+ ;\r
+ }\r
+\r
+ //Generer footer for varselet\r
+ public function getFooter($use_full_html){\r
+ $this->ht.=<<<EOT\r
+ </div>\r
+\r
+EOT\r
+ ;\r
+ // Her kan du endre footer til hva du vil. NB! Husk å skru det på, ved å endre instillingene i toppen av dokumentet\r
+ if($use_full_html){\r
+ $this->ht.=<<<EOT\r
+ </body>\r
+</html>\r
+\r
+EOT\r
+ ;\r
+ }\r
+ }\r
+\r
+\r
+ //Generer Copyright for data fra yr.no\r
+ public function getBanner($target='_top'){\r
+ $url=YRComms::convertEncodingEntities($this->yr_url);\r
+ $this->ht.=<<<EOT\r
+ <h1><a href="http://www.yr.no/" target="$target"><img src="http://fil.nrk.no/yr/grafikk/php-varsel/topp.png" alt="yr.no" title="yr.no er en tjeneste fra Meteorologisk institutt og NRK" /></a></h1>\r
+\r
+EOT\r
+ ;\r
+ }\r
+\r
+\r
+ //Generer Copyright for data fra yr.no\r
+ public function getCopyright($target='_top'){\r
+ $url=YRComms::convertEncodingEntities($this->yr_url);\r
+ /*\r
+ Du må ta med teksten nedenfor og ha med lenke til yr.no.\r
+ Om du fjerner denne teksten og lenkene, bryter du vilkårene for bruk av data fra yr.no.\r
+ Det er straffbart å bruke data fra yr.no i strid med vilkårene.\r
+ Du finner vilkårene på http://www.yr.no/verdata/1.3316805\r
+ */\r
+ $this->ht.=<<<EOT\r
+ <h2><a href="$url" target="$target">Værvarsel for $this->yr_name</a></h2>\r
+ <p><a href="http://www.yr.no/" target="$target"><strong>Værvarsel fra yr.no, levert av Meteorologisk institutt og NRK.</strong></a></p>\r
+\r
+EOT\r
+ ;\r
+ }\r
+\r
+\r
+ //Generer tekst for været\r
+ public function getWeatherText(){\r
+ if((isset($this->yr_data['TEXT'])) && (isset($this->yr_data['TEXT'][0]['LOCATION']))&& (isset($this->yr_data['TEXT'][0]['LOCATION'][0]['ATTRIBUTES'])) ){\r
+ $yr_place=$this->yr_data['TEXT'][0]['LOCATION'][0]['ATTRIBUTES']['NAME'];\r
+ if(!isset($this->yr_data['TEXT'][0]['LOCATION'][0]['TIME']))return;\r
+ foreach($this->yr_data['TEXT'][0]['LOCATION'][0]['TIME'] as $yr_var2){\r
+ // Små bokstaver\r
+ $l=(YRComms::convertEncodingUTF($yr_var2['TITLE'][0]['VALUE']));\r
+ // Rettet encoding\r
+ $e=YRComms::reviveSafeTags(YRComms::convertEncodingUTF($yr_var2['BODY'][0]['VALUE']));\r
+ // Spytt ut!\r
+ $this->ht.=<<<EOT\r
+ <p><strong>$yr_place $l</strong>:$e</p>\r
+\r
+EOT\r
+ ;\r
+ }\r
+ }\r
+ }\r
+\r
+ //Generer lenker til andre varsel\r
+ public function getLinks($target='_top'){\r
+ // Rens url\r
+ $url=YRComms::convertEncodingEntities($this->yr_url);\r
+ // Spytt ut\r
+ $this->ht.=<<<EOT\r
+ <p class="yr-lenker">$this->yr_name på yr.no:\r
+ <a href="$url/" target="$target">Varsel med kart</a>\r
+ <a href="$url/time_for_time.html" target="$target">Time for time</a>\r
+ <a href="$url/helg.html" target="$target">Helg</a>\r
+ <a href="$url/langtidsvarsel.html" target="$target">Langtidsvarsel</a>\r
+ </p>\r
+\r
+EOT\r
+ ;\r
+ }\r
+\r
+ //Generer header for værdatatabellen\r
+ public function getWeatherTableHeader(){\r
+ $name=$this->yr_name;\r
+ $this->ht.=<<<EOT\r
+ <table summary="Værvarsel for $name fra yr.no">\r
+ <thead>\r
+ <tr>\r
+ <th class="v" colspan="3"><strong>Varsel for $name</strong></th>\r
+ <th>Nedbør</th>\r
+ <th>Temp.</th>\r
+ <th class="v">Vind</th>\r
+ <th>Vindstyrke</th>\r
+ </tr>\r
+ </thead>\r
+ <tbody>\r
+\r
+EOT\r
+ ;\r
+ }\r
+\r
+\r
+ //Generer innholdet i værdatatabellen\r
+ public function getWeatherTableContent(){\r
+ $thisdate='';\r
+ $dayctr=0;\r
+ if(!isset($this->yr_data['TABULAR'][0]['TIME']))return;\r
+ $a=$this->yr_data['TABULAR'][0]['TIME'];\r
+\r
+ foreach($a as $yr_var3){\r
+ list($fromdate, $fromtime)=explode('T', $yr_var3['ATTRIBUTES']['FROM']);\r
+ list($todate, $totime)=explode('T', $yr_var3['ATTRIBUTES']['TO']);\r
+ $fromtime=YRComms::parseTime($fromtime);\r
+ $totime=YRComms::parseTime($totime, 1);\r
+ if($fromdate!=$thisdate){\r
+ $divider=<<<EOT\r
+ <tr>\r
+ <td colspan="7" class="skilje"></td>\r
+ </tr>\r
+\r
+EOT\r
+ ;\r
+ list($thisyear, $thismonth, $thisdate)=explode('-', $fromdate);\r
+ $displaydate=$thisdate.".".$thismonth.".".$thisyear;\r
+ $firstcellcont=$displaydate;\r
+ $thisdate=$fromdate;\r
+ ++$dayctr;\r
+ }else $divider=$firstcellcont='';\r
+\r
+ // Vis ny dato\r
+ if($dayctr<7){\r
+ $this->ht.=$divider;\r
+ // Behandle symbol\r
+ $imgno=$yr_var3['SYMBOL'][0]['ATTRIBUTES']['NUMBER'];\r
+ if($imgno<10)$imgno='0'.$imgno;\r
+ switch($imgno){\r
+ case '01': case '02': case '03': case '05': case '06': case '07': case '08':\r
+ $imgno.="d"; $do_daynight=1; break;\r
+ default: $do_daynight=0;\r
+ }\r
+ // Behandle regn\r
+ $rain=$yr_var3['PRECIPITATION'][0]['ATTRIBUTES']['VALUE'];\r
+ if($rain==0.0)$rain="0";\r
+ else{\r
+ $rain=intval($rain);\r
+ if($rain<1)$rain='<1';\r
+ else $rain=round($rain);\r
+ }\r
+ $rain.=" mm";\r
+ // Behandle vind\r
+ $winddir=round($yr_var3['WINDDIRECTION'][0]['ATTRIBUTES']['DEG']/22.5);\r
+ $winddirtext=$this->yr_vindrettninger[$winddir];\r
+ // Behandle temperatur\r
+ $temper=round($yr_var3['TEMPERATURE'][0]['ATTRIBUTES']['VALUE']);\r
+ if($temper>=0)$tempclass='pluss';\r
+ else $tempclass='minus';\r
+\r
+ // Rund av vindhastighet\r
+ $r=round($yr_var3['WINDSPEED'][0]['ATTRIBUTES']['MPS']);\r
+ // Så legger vi ut hele den ferdige linjen\r
+ $s=$yr_var3['SYMBOL'][0]['ATTRIBUTES']['NAME'];\r
+ $w=$yr_var3['WINDSPEED'][0]['ATTRIBUTES']['NAME'];\r
+\r
+ $this->ht.=<<<EOT\r
+ <tr>\r
+ <th>$firstcellcont</th>\r
+ <th>$fromtime–$totime</th>\r
+ <td><img src="$this->yr_imgpath/$imgno.png" width="38" height="38" alt="$s" /></td>\r
+ <td>$rain</td>\r
+ <td class="$tempclass">$temper°</td>\r
+ <td class="v">$w fra $winddirtext</td>\r
+ <td>$r m/s</td>\r
+ </tr>\r
+\r
+EOT\r
+ ;\r
+ }\r
+ }\r
+ }\r
+\r
+ //Generer footer for værdatatabellen\r
+ public function getWeatherTableFooter($target='_top'){\r
+ $this->ht.=<<<EOT\r
+ <tr>\r
+ <td colspan="7" class="skilje"></td>\r
+ </tr>\r
+ </tbody>\r
+ </table>\r
+ <p>Værsymbolet og nedbørsvarselet gjelder for hele perioden, temperatur- og vindvarselet er for det første tidspunktet. <1 mm betyr at det vil komme mellom 0,1 og 0,9 mm nedbør.<br />\r
+ <a href="http://www.yr.no/1.3362862" target="$target">Slik forstår du varslene fra yr.no</a>.</p>\r
+ <p>Vil du også ha <a href="http://www.yr.no/verdata/" target="$target">værvarsel fra yr.no på dine nettsider</a>?</p>\r
+EOT\r
+ ;\r
+ }\r
+\r
+\r
+ // Handle cache directory (re)creation and cachefile name selection\r
+ private function handleDataDir($clean_datadir=false,$summary=''){\r
+ global $yr_datadir;\r
+ // The md5 sum is to avoid caching to the same file on parameter changes\r
+ $this->datapath=$yr_datadir .'/'. ($summary!='' ? (md5($summary).'['.$summary.']_') : '').$this->datafile;\r
+ // Delete cache dir\r
+ if ($clean_datadir) {\r
+ unlink($this->datapath);\r
+ rmdir($yr_datadir);\r
+ }\r
+ // Create new cache folder with correct permissions\r
+ if(!is_dir($yr_datadir))mkdir($yr_datadir,0300);\r
+ }\r
+\r
+\r
+ //Main with caching\r
+ public function generateHTMLCached($url,$name,$xml, $url, $try_curl, $useHtmlHeader=true, $useHtmlFooter=true, $useBanner=true, $useText=true, $useLinks=true, $useTable=true, $maxage=0, $timeout=10, $urlTarget='_top'){\r
+ //Default to the name in the url\r
+ if(null==$name||''==trim($name))$name=array_pop(explode('/',$url));\r
+ $this->handleDataDir(false,htmlentities("$name.$useHtmlHeader.$useHtmlFooter.$useBanner.$useText.$useLinks.$useTable.$maxage.$timeout.$urlTarget"));\r
+ $yr_cached = $this->datapath;\r
+ // Clean name\r
+ $name=YRComms::convertEncodingUTF($name);\r
+ $name=YRComms::convertEncodingEntities($name);\r
+ // Clean URL\r
+ $url=YRComms::convertEncodingUTF($url);\r
+ // Er mellomlagring enablet, og trenger vi egentlig laste ny data, eller holder mellomlagret data?\r
+ if(($maxage>0)&&((file_exists($yr_cached))&&((time()-filemtime($yr_cached))<$maxage))){\r
+ $data['value']=file_get_contents($yr_cached);\r
+ // Sjekk for feil\r
+ if(false==$data['value']){\r
+ $data['value']='<p>Det oppstod en feil mens værdata ble lest fra lokalt mellomlager. Vennligst gjør administrator oppmerksom på dette! Teknisk: Sjekk at rettighetene er i orden som beskrevet i bruksanvisningen for dette scriptet</p>';\r
+ $data['error'] = true;\r
+ }\r
+ }\r
+ // Vi kjører live, og saver samtidig en versjon til mellomlager\r
+ else{\r
+ $data=$this->generateHTML($url,$name,$xml->getXMLTree($url, $try_curl, $timeout),$useHtmlHeader,$useHtmlFooter,$useBanner,$useText,$useLinks,$useTable,$urlTarget);\r
+ // Lagre til mellomlager\r
+ if($maxage>0 && !$data['error'] ){\r
+ $f=fopen($yr_cached,"w");\r
+ if(null!=$f){\r
+ fwrite($f,$data['value']);\r
+ fclose($f);\r
+ }\r
+ }\r
+ }\r
+ // Returner resultat\r
+ return $data['value'];\r
+ }\r
+\r
+ private function getErrorMessage(){\r
+ if(isset($this->yr_data['ERROR'])){\r
+ $error=$this->yr_data['ERROR'][0]['VALUE'];\r
+ //die(retar($error));\r
+ $this->ht.='<p style="color:red; background:black; font-weight:900px">' .$error.'</p>';\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ //Main\r
+ public function generateHTML($url,$name,$data,$useHtmlHeader=true,$useHtmlFooter=true,$useBanner=true,$useText=true,$useLinks=true,$useTable=true,$urlTarget='_top'){\r
+ // Fyll inn data fra parametrene\r
+ $this->ht='';\r
+ $this->yr_url=$url;\r
+ $this->yr_name=$name;\r
+ $this->yr_data=$data;\r
+\r
+ // Generer HTML i $ht\r
+ $this->getHeader($useHtmlHeader);\r
+ $data['error'] = $this->getErrorMessage();\r
+ if($useBanner)$this->getBanner($urlTarget);\r
+ $this->getCopyright($urlTarget);\r
+ if($useText)$this->getWeatherText();\r
+ if($useLinks)$this->getLinks($urlTarget);\r
+ if($useTable){\r
+ $this->getWeatherTableHeader();\r
+ $this->getWeatherTableContent();\r
+ $this->getWeatherTableFooter($urlTarget);\r
+ }\r
+ $this->getFooter($useHtmlFooter);\r
+\r
+ // Returner resultat\r
+ //return YRComms::convertEncodingEntities($this->ht);\r
+ $data['value'] = $this->ht;\r
+ return $data;\r
+ }\r
+}\r
+\r
+?>
\ No newline at end of file