GA Event Notifier

This calendar consists of an lsl script and a php script.
The lsl script is listed first, and the php script is listed below it.
Please be careful not to overlap when copying the scripts.
 FUNCTION: 
 Gather seven days event data from a Google calendar and display it through a simple interface.
 The lsl script can access several calendars at once through seperate php files. One file per calendar.
/////////////////////////////////////////////////////////////////////
// GA Event Notifier 1.0 by Jason Dahlen (aka Victor Hua)
// SpotOn3D
// https://spoton3d.com/
// (c) 2010 - Jason Dahlen
//
// Distributed as GPL, donated to wiki.secondlife.com on 13 July 2010
//
// SCRIPT: GA Event Notifier.lsl 1.0 :: Use on your web server
// gaenot_1.0.php :: Use inworld
//
// FUNCTION: 
// Gather seven days event data from a Google calendar and display it through a simple interface.
//The lsl script can access several calendars at once through seperate php files. One file per calendar.
//
// USAGE: 
// 1. Place gaenot_1.0.php in your web directory. Anywhere you can view the php file in a web browser.
// You will need a seperate gaenot_1.0.php file for each calendar you want to display. You can rename the files.
// 2. At the top of your gaenot_1.0.php file you will find two variables.
// $email Enter your gmail address
// $Calendar_xml_URL A URL that points to your Live Bookmarks feed for Google Calendars.
// You can find this under My Calendar in the settings toward the bottom.
// Choose the 'xml' button selection from the following:
// -Calendar Address - This address works if you have a publically viewable calendar 
// (ie viewable publically in a web browser)
// -Private Address - Use this address if you want to display information from an
// otherwise private calendar. This calendar would then only be viewable by
// yourself and those using the in world lsl tool.
// 3. Drop the GA Event Notifier.lsl in your object. 
// 4. Add the locations of the php files in the url list. You can have one or several.
// 5. Set the gmtOffset to your time or the time of the calendar you are accessing.
//
/////////////////////////////////////////////////////////////////////
//Add URLs to the list pointing to the location of your gaenot.php script.
//list urls = [
// "https://yourdomain.com/gaenot_1.0.php",
// "https://yourdomain.com/gaenot_1.0-2.php"
// ];
list urls = [
 "https://yourdomain.com/gaenot_1.0.php"
 ];
//Set the GMT offset to your timezone or to the timezone of the google calendar.
integer gmtOffset = -5;
//######################################### Edit below this line at your own risk ##########################
list days; //Day value reference
list dates; //List of event dates
list titles; //Event titles
list place; //Event locations if given
list details; //Event details if given
integer calendars; //Number of calendars traced by this tool.
integer thisCalendar; //Used when retrieving calendar data.
//Used to parse incoming event data
list weekdays = ["Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed"];
//Used for generating button list.
list week = ["Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday"];
list buttonList;
//Channels
integer CHANNEL;
integer HANDLE;
//Initialize script variables
constructor()
{
 days = [];
 dates = [];
 titles = [];
 place = [];
 details = [];
 calendars = llGetListLength(urls);
 thisCalendar = 0;
 llSetTimerEvent(3600);
 makeButtonList();
 //llHTTPRequest(url, [], "");
 requestData();
 llOwnerSay("Events List Refreshed");
 llOwnerSay("");
 llListenControl(HANDLE, FALSE);
}
requestData()
{
 if(thisCalendar < calendars)
 {
 llHTTPRequest(llList2String(urls,thisCalendar), [], "");
 thisCalendar += 1;
 }
}
// Generate dialog button list
makeButtonList()
{
 buttonList = [];
 list tempList = [];
 integer day = getDay(gmtOffset);
 integer i;
 for (i=0; i<7; i++)
 {
 tempList += llList2String(week,day);
 day++;
 if (day > 6)
 {
 day = 0;
 }
 }
 
 buttonList = [llList2String(tempList,6),"Today", "Refresh",
 llList2String(tempList,3), llList2String(tempList,4), llList2String(tempList,5),
 llList2String(tempList,0), llList2String(tempList,1), llList2String(tempList,2)];
}
//Creates dialog channel based on the object UUID. Reduces the chance of cross messaging.
integer hex2int(string hex) 
{
 if(llGetSubString(hex,0,1) == "0x")
 return (integer)hex;
 if(llGetSubString(hex,0,0) == "x") 
 return (integer)("0"+hex);
 return(integer)("0x"+hex); 
} 
//Parse incoming data from the php file into seperate lists.
parceString(string body)
{
 list tempList = llParseString2List(body, ["||"], []);
 
 integer listLength = llGetListLength(tempList);
 integer i;
 
 for (i = 0; i < listLength; i++)
 {
 list data = llParseString2List(llList2String(tempList, i), [":"], []);
 string flag = llStringTrim(llList2String(data,0), STRING_TRIM);
 string val = llStringTrim(llList2String(data,1), STRING_TRIM);
 
 if (flag == "Date")
 {
 string day = llList2String(llParseString2List(val, [" "], []), 0);
 integer dayNum = llListFindList(weekdays, [day]);
 days += dayNum;
 dates+=val;
 }
 else
 if (flag == "Title")
 {
 titles+=val;
 }
 else
 if (flag == "Event Description")
 {
 //Google uses a colon for its data tags. 
 //Unfortionatly this means that if you used a colon in your description such as a URL, it would be cut off prematurly. 
 //I put a check here so at least two URLs or SLURLS such as secondlife://lambda/175/30/26 could be included.
 if (llStringTrim(llList2String(data,3), STRING_TRIM) != "")
 {
 place += (val + ":" + llStringTrim(llList2String(data,2), STRING_TRIM)+ ":" + llStringTrim(llList2String(data,3), STRING_TRIM));
 }
 else
 if (llStringTrim(llList2String(data,2), STRING_TRIM) != "")
 {
 place += (val + ":" + llStringTrim(llList2String(data,2), STRING_TRIM));
 }
 else
 {
 place+=val;
 }
 }
 else
 if (flag == "Where" || flag == "Event Status")
 {
 details+=val;
 }
 }
}
//Display day event.
displayEvent(integer day)
{
 llListenControl(HANDLE, FALSE);
 integer i;
 if(llListFindList(days, [day]) != -1)
 {
 for (i=0; i<llGetListLength(days); i++)
 {
 if (llList2Integer(days,i) == day)
 {
 llOwnerSay("Event Date: " + llList2String(dates, i));
 llOwnerSay("Event Name: " + llList2String(titles, i));
 llOwnerSay(llList2String(place, i));
 llOwnerSay(llList2String(details, i));
 llOwnerSay("");
 }
 }
 }
 else
 {
 llOwnerSay("No events found for the day selected.");
 llOwnerSay("");
 }
}
//Get what day it is today based on ineger value
integer getDay(integer offset) {
 integer hours = llGetUnixTime()/3600;
 integer days = (hours + offset)/24;
 integer day_of_week = days%7;
 return day_of_week;
}
default
{
 state_entry()
 {
 CHANNEL = hex2int(llGetKey());
 HANDLE = llListen(CHANNEL, "", "", "");
 llListenControl(HANDLE, FALSE);
 constructor();
 }
 touch_start(integer start)
 {
 llListenControl(HANDLE, TRUE);
 llDialog(llDetectedKey(0), "Google Access Event Calendar \n \n" + llList2String(week,getDay(0)) + " "+ llGetDate(), buttonList, CHANNEL);
 }
 http_response(key request_id, integer status, list metadata, string body)
 {
 parceString(body);
 requestData();
 }
 listen(integer channel, string name, key id, string message)
 {
 //0 => "Thu", 1 =>"Fri", 2=>"Sat", 3=>"Sun", 4=>"Mon", 5=>"Tue", 6=>"Wed"];
 if(message == "Today")
 {
 displayEvent(getDay(gmtOffset));
 }
 else
 if(message == "Sunday")
 {
 displayEvent(3);
 }
 else
 if(message == "Monday")
 {
 displayEvent(4);
 }
 else
 if(message == "Tuesday")
 {
 displayEvent(5);
 }
 else
 if(message == "Wednesday")
 {
 displayEvent(6);
 }
 else
 if(message == "Thursday")
 {
 displayEvent(0);
 }
 else
 if(message == "Friday")
 {
 displayEvent(1);
 }
 else
 if(message == "Saturday")
 {
 displayEvent(2);
 }
 else
 if(message == "Refresh")
 {
 constructor();
 }
 }
 timer()
 {
 llSetTimerEvent(3600);
 constructor();
 }
}
Start of the gaenot_1.0.php script.
<source lang="php">
<?php
/*
/////////////////////////////////////////////////////////////////////
// GA Event Notifier 1.0 by Jason Dahlen (aka Victor Hua)
// SpotOn3D
// https://spoton3d.com/
// (c) 2010 - Jason Dahlen
//
// Distributed as GPL, donated to wiki.secondlife.com on 13 July 2010
//
// SCRIPT: GA Event Notifier.lsl 1.0 :: Use on your web server
// gaenot_1.0.php :: Use inworld
//
// FUNCTION: 
// Gather seven days event data from a Google calendar and display it through a simple interface.
//The lsl script can access several calendars at once through seperate php files. One file per calendar.
//
// USAGE: 
// 1. Place gaenot_1.0.php in your web directory. Anywhere you can view the php file in a web browser.
// You will need a seperate gaenot_1.0.php file for each calendar you want to display. You can rename the files.
// 2. At the top of your gaenot_1.0.php file you will find two variables.
// $email Enter your gmail address
// $Calendar_xml_URL A URL that points to your Live Bookmarks feed for Google Calendars.
// You can find this under My Calendar in the settings toward the bottom.
// Choose the 'xml' button selection from the following:
// -Calendar Address - This address works if you have a publically viewable calendar 
// (ie viewable publically in a web browser)
// -Private Address - Use this address if you want to display information from an
// otherwise private calendar. This calendar would then only be viewable by
// yourself and those using the in world lsl tool.
// 3. Drop the GA Event Notifier.lsl in your object. 
// 4. Add the locations of the php files in the url list. You can have one or several.
// 5. Set the gmtOffset to your time or the time of the calendar you are accessing.
//
/////////////////////////////////////////////////////////////////////
*/
$email = 'myname@gmail.com';
$Calendar_xml_URL = "http://www.google.com/calendar/feeds/myfeed";
//######################################### Edit below this line at your own risk ##########################
/*Debug
ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);
*/
 $userid = $email;
 $magicCookie = 'cookie';
 date_default_timezone_set('America/Chicago');
 
 // build feed URL
 $feedURL = $Calendar_xml_URL;
 //Return string date as a timestamp.
 function _dateConv($str)
 {
 $dateStr = substr_replace($str[3], , -1, 1).' '.$str[2];
 
 if (isset($str['4']))
 {
 $dateStr = $dateStr.' '.$str[4];
 }
 if (isset($str['5']))
 {
 $dateStr = $dateStr.' '.$str[5];
 }
 
 if (isset($str[7]))
 {
 $dateStr = $dateStr.' '.substr($str[7], -3, 3);
 }
 return $dateStr;
 }
 //Print Array
 function printArrayElements($array)
 {
 foreach($array as $key => $value)
 {
 echo "$value"."||";
 }
 }
 // read feed into SimpleXML object
 $sxml = simplexml_load_file($feedURL);
 
 // get number of events
 $total = count($sxml);
 //Populate data arrays
 foreach ($sxml->entry as $entry) 
 {
 $content = stripslashes($entry->content);
 $data = explode('', $content);
 $dateArr = explode(" ",$data[0]);
 $dateString = _dateConv($dateArr);
 $date = strtotime(_dateConv($dateArr));
 $pastDue = strtotime("12:00 am -11 hours");
 $endDate = strtotime("+6 day");
 if ($date > $pastDue && $date < $endDate)
 {
 $t = "test string"; 
 $timeList[] = 'Date: '.$dateArr[1].' '.trim($dateString);
 $titleList[] = 'Title: '.trim(stripslashes($entry->title));
 $placeList[] = trim($data[2]);
 if (isset($data[4]))
 {
 $descList[] = trim($data[4]);
 }
 else
 {
 $descList[] = "Event Description:";
 }
 }
 }
 //print arrays
 
 printArrayElements($timeList);
 printArrayElements($titleList);
 printArrayElements($placeList);
 printArrayElements($descList);
 ?>
</php>