--- /dev/null
+<?php
+
+$url = $_GET['url'];
+
+$file = file($url);
+
+$directives = array();
+
+header('Content-type: text/plain; charset=utf-8');
+
+$d = -1;
+
+foreach($file as $line){
+ $line = rtrim($line, "\r\n");
+ if($line[0] == "\t" || $line[0] == " "){
+ $directives[$d] .= substr($line,1);
+ } else {
+ $d ++;
+ $directives[$d] = $line;
+ }
+}
+
+// sanity check
+
+if(
+ ($directives[0] != 'BEGIN:VCALENDAR') ||
+ ($directives[$d] != 'END:VCALENDAR')
+){
+ exit('INVALID .ICAL FILE');
+}
+
+$ical = new ical_obj();
+
+$current = $ical;
+
+class ical_obj {
+ public $_type = NULL;
+ public $_parent = NULL;
+ private $_data = array();
+ function __isset($name){
+ return isset($this->_data[$name]);
+ }
+ function __get($name){
+ return $this->_data[$name];
+ }
+ function __set($name, $value){
+ return ($this->_data[$name][] = $value);
+ }
+ function __unset($name){
+ unset($this->_data[$name]);
+ }
+ function display($t = 0){
+ foreach($this->_data as $k => $l){
+ foreach($l as $v){
+ for($i = 0; $i < $t; $i ++){ echo "\t"; }
+ echo $k . ': ';
+ if(is_object($v)){
+ echo "\r\n"; $v->display($t + 1);
+ } else {
+ echo $v . "\r\n";
+ }
+ }
+ }
+ }
+}
+
+foreach($directives as $line){
+ $directive = explode(':', $line, 2);
+ if($directive[0] == 'BEGIN'){
+ $child = new ical_obj();
+ $child->_type = $type = $directive[1];
+ $child->_parent = $current;
+ $current->$type = $child;
+ $current = $child;
+ } elseif($directive[0] == 'END'){
+ if($current->_type != $directive[1]){
+ exit('INVALID .ICAL FILE');
+ }
+ $current = $current->_parent;
+ } else {
+ $type = $directive[0];
+ $current->$type = $directive[1];
+ }
+}
+
+$ical->display();
+