checking in an application written by Ivan Litovski. If you're going to OSCon, this is a must.
authorJohn Kern <johnk@symbian.org>
Fri, 17 Jul 2009 15:52:45 -0700
changeset 7 97dcd250e5be
parent 6 5e0dece09f96
child 8 885e919ca4a5
checking in an application written by Ivan Litovski. If you're going to OSCon, this is a must.
OSCON/Icon.png
OSCON/Info.plist
OSCON/Main.js
OSCON/OSCON20090720.ics
OSCON/OSCON20090721.ics
OSCON/OSCON20090722.ics
OSCON/OSCON20090723.ics
OSCON/OSCON20090724.ics
OSCON/WRTKit/Resources/CheckBox.png
OSCON/WRTKit/Resources/ContentPanelFoldIcons.png
OSCON/WRTKit/Resources/ControlAssemblyBackground.png
OSCON/WRTKit/Resources/DocumentBackground.png
OSCON/WRTKit/Resources/FormButtonCenter.png
OSCON/WRTKit/Resources/FormButtonLeft.png
OSCON/WRTKit/Resources/FormButtonRight.png
OSCON/WRTKit/Resources/ListViewCaptionBackground.png
OSCON/WRTKit/Resources/NotificationPopupBackground.png
OSCON/WRTKit/Resources/NotificationPopupTypeIndicator.png
OSCON/WRTKit/Resources/ProgressBarUnknown.gif
OSCON/WRTKit/Resources/RadioButton.png
OSCON/WRTKit/Resources/ScrollbarThumbBottom.png
OSCON/WRTKit/Resources/ScrollbarThumbMiddle.png
OSCON/WRTKit/Resources/ScrollbarThumbTop.png
OSCON/WRTKit/Resources/ScrollbarTrackBottom.png
OSCON/WRTKit/Resources/ScrollbarTrackMiddle.png
OSCON/WRTKit/Resources/ScrollbarTrackTop.png
OSCON/WRTKit/Resources/SeparatorCenter.png
OSCON/WRTKit/Resources/SeparatorLeft.png
OSCON/WRTKit/Resources/SeparatorRight.png
OSCON/WRTKit/Resources/Thumbs.db
OSCON/WRTKit/Resources/UI.css
OSCON/WRTKit/UI/ActionControl.js
OSCON/WRTKit/UI/Ajax.js
OSCON/WRTKit/UI/ContentPanel.js
OSCON/WRTKit/UI/Control.js
OSCON/WRTKit/UI/FormButton.js
OSCON/WRTKit/UI/ImageLabel.js
OSCON/WRTKit/UI/Label.js
OSCON/WRTKit/UI/ListView.js
OSCON/WRTKit/UI/NavigationButton.js
OSCON/WRTKit/UI/NotificationPopup.js
OSCON/WRTKit/UI/OsconContentPanel.js
OSCON/WRTKit/UI/Scrollbar.js
OSCON/WRTKit/UI/SelectionControl.js
OSCON/WRTKit/UI/SelectionList.js
OSCON/WRTKit/UI/SelectionMenu.js
OSCON/WRTKit/UI/Separator.js
OSCON/WRTKit/UI/SlidingTransition.js
OSCON/WRTKit/UI/TextArea.js
OSCON/WRTKit/UI/TextEntryControl.js
OSCON/WRTKit/UI/TextField.js
OSCON/WRTKit/UI/UIElement.js
OSCON/WRTKit/UI/UIInit.js
OSCON/WRTKit/UI/UIManager.js
OSCON/WRTKit/UI/View.js
OSCON/WRTKit/Utils/Logger.js
OSCON/WRTKit/WRTKit.js
OSCON/day.png
OSCON/day1.png
OSCON/day2.png
OSCON/day3.png
OSCON/day4.png
OSCON/day5.png
OSCON/iCalReader.js
OSCON/index.html
OSCON/logo.png
OSCON/oscon-home.png
OSCON/oscon.css
OSCON/session.png
OSCON/test.html
Binary file OSCON/Icon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/Info.plist	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Nokia//DTD PLIST 1.0//EN" "http://www.nokia.com/DTDs/plist-1.0.dtd">
+<plist version="1.0">
+    <dict>
+        <key>DisplayName</key>
+        <string>OSCON</string>
+        <key>Identifier</key>
+        <string>com.symbian.oscon.widget</string>
+        <key>Version</key>
+        <string>1.0</string>
+        <key>MainHTML</key>
+        <string>index.html</string>
+        <key>AllowNetworkAccess</key>
+        <true/>
+        <key>MiniViewEnabled</key>
+		<false/>
+    </dict>
+</plist>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/Main.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,352 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+var currentFontSize = 14;
+var uiManager;
+var home;
+var mainView;
+var osconIcalUrl = new Array();
+var icalData = new Array();
+var icalReader = new Array();
+var osconDays = new Array();
+var http;
+var downloadDayIndex = -1;
+
+// Called from the onload event handler to initialize the widget.
+function init() {
+	
+	for (var i = 0; i < 5; i++) {
+		var osconDay = new Date()
+		osconDay.setFullYear(2009, 6, 20 + i);
+		osconDays.push(osconDay);
+		osconIcalUrl.push("OSCON200907" + (20+i) + ".ics");
+		icalData.push(null);
+		icalReader.push(null);
+	}
+	
+    // set tab-navigation mode and show softkeys
+    // (only if we are in the WRT environment)
+    if (window.widget) {
+		//create about menu
+	
+        widget.setNavigationEnabled(false);
+        menu.showSoftkeys();
+    }
+	
+	// create UI manager
+	uiManager = new UIManager();
+
+	home = new ListView(null,null);
+	
+	var homeViewImage = new ImageLabel(null, null, "oscon-home.png");
+	// hack to center image
+	homeViewImage.contentElement.style.textAlign = "center";
+	home.addControl(homeViewImage);
+
+	var homeViewImage2 = new ImageLabel(null, null, "logo.png");
+	// hack to center image
+	homeViewImage2.contentElement.style.textAlign = "center";
+	home.addControl(homeViewImage2);
+	
+	mainView = new ListView(null, "<img src=oscon-home.png>");
+	
+	
+	for (var i = 0; i < osconDays.length; i++) {
+		var button = new NavigationButton(i, "day"+(i+1)+".png", dateToString(osconDays[i]));
+		mainView.addControl(button);
+		button.addEventListener("ActionPerformed", function(event){
+			var clickedButton = event.source;
+			var clickedId = clickedButton.id;
+			showDay(clickedId, osconDays[clickedId], null);
+			});
+	}	
+	
+	home.previousView=mainView;
+	home.show();
+	
+	uiManager.showNotification(-1, "wait", "Please wait...", -1);
+	setTimeout(function(){	uiManager.hideNotification();mainView.show();}, 1000);
+}
+
+
+function showDay(dayIndex, date) {
+	downloadDayIndex = dayIndex;
+	if ( icalReader[dayIndex] == null ) {
+		downloadIcalData(dayIndex);
+	} else {
+		showList(date, null);
+	}
+}
+
+function downloadIcalData(dayIndex) {
+	downloadDayIndex = dayIndex;
+	uiManager.showNotification(-1, "wait", "Please wait...", -1);
+
+	http = new Ajax();
+    http.onreadystatechange = function() { downloadStateChanged(); };
+
+    // initiate the request
+    http.open("GET", osconIcalUrl[downloadDayIndex], true);
+    http.send(null);
+}
+
+function downloadStateChanged(){
+	// complete request?
+    if (http.readyState == 4) {
+        // attempt to get response status
+        var responseStatus = null;
+        try {
+            responseStatus = http.status;
+        } catch (noStatusException) {}
+        
+		// are we being prompted for login?
+		icalData[downloadDayIndex] = http.responseText;
+		try {
+			dataAvailable(downloadDayIndex);
+//			savePreferences();
+		}catch(x) {
+			uiManager.showNotification(5000, "warning", "Error processing feed");
+		}
+		downloadInProgress = false;
+    }
+}
+
+function dataAvailable(downloadDayIndex){
+	uiManager.showNotification(-1, "wait", "Parsing info...", -1);
+	// parse iCal
+	var reader = new iCalReader(); // Construction of the reader object.
+	reader.prepareData(icalData[downloadDayIndex]); // Prepare and set the data for the parser.
+	reader.parse(); // Parse the data.
+	reader.sort(); // Sort the data.
+	icalReader[downloadDayIndex] =  reader;
+	showList(osconDays[downloadDayIndex], null);
+	uiManager.hideNotification();
+}
+
+function showList(day, session) {
+	var list = new ListView(null, "<img src=oscon-home.png>");
+	if (day) {
+		var button = new ImageLabel(null, dateToString(day), "day"+(downloadDayIndex+1)+".png");
+		list.addControl(button);
+	}
+	if (session) {
+		var button = new ImageLabel(null, sessionTimeToString(session) + ", " + dateToString(session) , "session.png");
+		list.addControl(button);
+	}
+	
+	var myCalReader = icalReader[downloadDayIndex];
+	var events = myCalReader.getCalendar().getEvents(); // Get all events.
+	var num = myCalReader.getCalendar().getNrOfEvents();
+
+	var addedSessions = new Array();
+
+	
+	for(var i=0; i<num; i++) { // Loop through all events.
+	
+		var event = myCalReader.getCalendar().getEventAtIndex(i); // A single event.        
+		
+		// Get Javascript date for start and end time.
+		var startDate = event.getStartDate();
+		var altStartDate = null;
+		try {
+			altStartDate = event.getAltStartDate();
+		} catch(z) {
+			altStartDate = startDate; 
+		}
+		var timeZone = event.getTimeZone();
+		
+		if ( day ) {
+			if ( ! dayMatches(day, startDate) ) {
+				continue;
+			} else {
+				var haveit = false;
+				// if session is not in already, add it
+				for (var j = 0 ; j < addedSessions.length ; j++ ) {
+					if ( sessionMatches(addedSessions[j], altStartDate ) ) {
+						haveit = true;
+						break;
+					}
+				}
+				if (!haveit) {
+					// add it
+					addedSessions.push(altStartDate);
+					var button = new NavigationButton(altStartDate.getTime(), "session.png", "Session @ "+ sessionTimeToString(altStartDate));
+					button.addEventListener("ActionPerformed", function(event){
+						var clickedButton = event.source;
+						var clickedId = clickedButton.id;
+						var ed = new Date();
+						ed.setTime(clickedId);
+						showList(null, ed);
+					});
+					list.addControl(button);
+				}
+				continue;
+			}
+		}
+		else if ( ! sessionMatches(session, startDate) ) {
+			continue;
+		}
+
+
+		// add events
+		var endDate = event.getEndDate();
+		var location = event.getProperty("LOCATION");
+		var summary = event.getProperty("SUMMARY");
+		var description = event.getProperty("DESCRIPTION");
+		var url = event.getProperty("URL");
+
+		var buf = "";
+		buf += "<div class=\"FeedItemDate\">" ;
+		if ( location != null ) {
+			buf += location + ", ";
+		}
+		buf += sessionTimeToString(startDate) +"-" + sessionTimeToString(endDate) + " " + timeZone + "</div>";
+		buf += "<div class=\"FeedItemDescription\">" + description + "</div>";
+		if (url != null) {
+	        buf += "<div class=\"FeedItemLink\">";
+            buf += "<a href=\"JavaScript:void(0)\" onclick=\"openURL('" + url + "'); return false;\">";
+            buf += "Read more...";
+            buf += "</a>";
+	        buf += "</div>";
+		}
+		
+		var cp = new ContentPanel(null, null, null, true);
+
+		// initialize feed item control
+		cp.setCaption(summary);
+		cp.setContent(buf);
+		cp.setExpanded(false);
+		list.addControl(cp); 	
+	} // End for each event.
+	list.previousView = uiManager.currentView;
+	list.show();
+}
+
+
+// Loads widget preferences.
+function loadPreferences() {
+    if (window.widget) {
+        // load settings from widget preferences store
+        icalData = widget.preferenceForKey("icalData");
+    }
+}
+
+// Loads widget preferences.
+function savePreferences() {
+    if (window.widget) {
+        // save settings in widget preferences store
+        widget.setPreferenceForKey(icalData, "icalData");
+    }
+}
+
+
+
+function setDefaultFontSizeForScreenSize(){
+	// first check if there is a preference present
+    if (window.widget) {
+		var saved = widget.preferenceForKey("fontsize");
+		if ( widget.preferenceForKey("fontsize") ) {
+			setCssBodyFontSize(parseInt(saved));
+		}
+		else {
+			// no preference available, check screen size
+			if (window.screen.width > 400 || window.screen.height > 400) {
+				// hi res screen, use large font
+				setCssBodyFontSize(18);
+			}
+			else {
+				// lo res screen, use small font
+				setCssBodyFontSize(14);
+			}
+		}
+	}
+}
+
+function increaseFontSize(){
+    if (window.widget) {
+		setCssBodyFontSize(currentFontSize + 2);
+	}
+}
+
+function decreaseFontSize(){
+    if (window.widget) {
+		if (currentFontSize > 4) {
+			setCssBodyFontSize(currentFontSize - 2);
+		}
+	}
+}
+
+function setCssBodyFontSize(size) {
+    if (window.widget) {
+		currentFontSize = size;
+		var sizestring = "" + size;
+		document.body.style.fontSize = sizestring + "px";
+		widget.setPreferenceForKey(sizestring, "fontsize");
+	}
+}
+
+function nocache(url) {
+    if (url.indexOf("?") == -1) {
+        url += "?";
+    } else {
+        url += "&";
+    }
+    url += "nocache=" + (new Date().getTime());
+	return url;
+}
+
+
+function sessionMatches(session, startDate) {
+	var m_date = session.getDate()==startDate.getDate();
+	var m_year = session.getFullYear()==startDate.getFullYear();
+	var m_month = session.getMonth()==startDate.getMonth();
+	var m_hour = session.getHours()==startDate.getHours();
+	var m_minute = session.getMinutes()==startDate.getMinutes();
+	return m_date && m_month && m_year && m_hour && m_minute; 
+}
+
+function dayToString(day) {
+	return day.toDateString(); 	
+}
+
+function dayMatches(day, startDate){
+	var m_date = day.getDate()==startDate.getDate();
+	var m_year = day.getFullYear()==startDate.getFullYear();
+	var m_month = day.getMonth()==startDate.getMonth();
+	return m_date && m_month && m_year; 
+}
+
+function sessionTimeToString(session) {
+	return ""+session.getHours()+":"+pad(session.getMinutes(),2); 	
+}
+
+function dateToString(day) {
+	var full = day.toDateString();
+	// remove year as it doesn't fit on small screens
+	return full.substring(0, full.length-4); 	
+}
+
+function pad(num, digits) {
+	var str = "" + num;
+	while ( str.length < digits ) {
+		str = "0" + str;
+	}
+	return str;
+}
+
+// Opens a URL in a separate browser window
+function openURL(url) {
+    if (window.widget) {
+        // in WRT
+        widget.openURL(url);
+    } else {
+        // outside WRT
+        window.open(url, "NewWindow");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/OSCON20090720.ics	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,410 @@
+BEGIN:VCALENDAR
+X-WR-CALNAME:OSCON 2009
+VERSION:2.0
+PRODID:Expectnation
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090629T224138
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8466
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--8466
+SUMMARY:PHP: The Good Parts
+DESCRIPTION:Presented by Chris Shiflett (OmniTI), Sean Coates (OmniTI). 
+ PHP has a reputation for being poorly designed and inconsistent. This re
+ putation has been earned through a lifetime of organic growth. Some of t
+ his criticism is deserved, but some parts—The Good Parts—keep us coming 
+ back for more. Join us as we discuss the reasons why PHP powers most of 
+ the Web despite its flaws.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090629T223557
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7757
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--7757
+SUMMARY:Introduction to JRuby
+DESCRIPTION:Presented by Neal Ford (ThoughtWorks). JRuby is Ruby on the 
+ Java Platform, so it brings the advantages of Ruby to the JVM and the ad
+ vantages of Java to Ruby. This session shows Ruby syntax and lots of int
+ egration techniques with Java, including building Swing-based UI's using
+  Swiby and how to unit test Java code with JRuby.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090310T220530
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7974
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--7974
+SUMMARY:Introduction to Google App Engine
+DESCRIPTION:Presented by Joe Gregorio (Google). Overview of App Engine a
+ nd its major components, including an overview of the APIs the SDK provi
+ des, the underlying technologies App Engine is built on. Tutorial is a h
+ ands on event where we will build multiple applications over three hours
+  exploring many of features and APIs in App Engine.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090608T172449
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8266
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--8266
+SUMMARY:Simplifying Database Design
+DESCRIPTION:Presented by Josh Berkus (PostgreSQL Experts, Inc.). In 10 y
+ ears of fixing other people's SQL databases, I've noticed that the less 
+ the original developer knew, the more complex the databases are ... and 
+ the more complex the problems.  Here I offer a refreshing approach for s
+ imple SQL database design.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090310T213951
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7553
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--7553
+SUMMARY:Mastering Perl
+DESCRIPTION:Presented by brian d foy (Stonehenge Consulting Services). G
+ o beyond the syntax and idioms of Perl to manage your code base so it do
+ esn't manage you. Show your Perl code who is in charge through benchmark
+ ing and profiling, configuration, logging, and fixing third party module
+ s.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090629T223849
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8158
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--8158
+SUMMARY:Finding the Swan in Squeak's Ugly Duckling
+DESCRIPTION:Presented by Randal L. Schwartz (Stonehenge Consulting Servi
+ ces, Inc.). Squeak Smalltalk is wholly unlike any other open source prog
+ ramming tool you've worked with - and mostly in good ways. Unfortunately
+ , it's the bad ways that make the first impression. This hands-on tutori
+ al will help you get past the unfamiliar and the unwieldy so that you ca
+ n take advantage of the elegant and productive environment that lies und
+ erneath.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090629T223842
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8061
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--8061
+SUMMARY:Perl 6: Why? What? How?
+DESCRIPTION:Presented by Damian Conway (Thoughtstream). This half-day tu
+ torial provides a comprehensive and practical introduction to the new la
+ nguage, specifically designed to get current Perl 5 programmers up to sp
+ eed on the new and powerful features of Perl 6.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090629T224126
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8118
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--8118
+SUMMARY:Automating Enterprise Workflow with Open Source Tools
+DESCRIPTION:Presented by Jim Brandt (Synacor, Inc.). In difficult financ
+ ial times, all businesses are looking to do more with less. Automating r
+ epetitive tasks with computers is one way to do this. This tutorial will
+  discuss how to use open source tools to implement workflow using real-w
+ orld examples.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T120000
+DTSTART;TZID=US/Pacific:20090720T083000
+DTSTAMP:20090629T223543
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8575
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-08:30--8575
+SUMMARY:The Open, Social Web Workshop
+DESCRIPTION:Presented by Chris Messina (OpenID Foundation), David Record
+ on (Six Apart), Joseph Smarr (Plaxo). As evidenced by Barack Obama’s suc
+ cessful presidential campaign, we have clearly entered the age of the so
+ cial web. This developer-oriented workshop will emphasize the use and ap
+ plication of free, open building blocks for enabling social networking f
+ eatures on your site or service, and provide illuminating insights from 
+ some of the key figures creating these technologies.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090629T225624
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8125
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8125
+SUMMARY:Introduction to Web Application Development Using Smalltalk Seas
+ ide
+DESCRIPTION:Presented by Randal L. Schwartz (Stonehenge Consulting Servi
+ ces, Inc.). An introduction to the Seaside Smalltalk web development fra
+ mework.  Presumes basic knowledge of object-oriented programming using S
+ malltalk GUIs, such as Squeak or VisualWorks. Covers Seaside concepts of
+  components and html templating, including continuations for advanced ca
+ llbacks and some persistence solutions.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090629T225110
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7728
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--7728
+SUMMARY:XMPP 101: Building Real-Time Applications with Jabber Technologi
+ es
+DESCRIPTION:Presented by Peter Saint-Andre (Cisco), Jack Moffitt (Collec
+ ta). Jabber/XMPP technologies are the gold standard for real-time messag
+ ing, presence, and collaboration over the Internet. This interactive tut
+ orial provides a fast-paced introduction to XMPP, including many practic
+ al guidelines and "gotchas" that will help you get off to a fast start w
+ ith XMPP-based software projects.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090629T225402
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8035
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8035
+SUMMARY:Internet Programming with Python
+DESCRIPTION:Presented by wesley chun (CyberWeb Consulting). Python is an
+  interpreted, cross-platform, object-oriented programming language that 
+ is popular for a wide range of applications, one of which is Internet pr
+ ogramming. This tutorial introduces current Python programmers to three 
+ distinct areas of Internet programming, each in self-contained one-hour 
+ lectures with a demonstration of code following each lecture topic.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090310T234227
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7953
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--7953
+SUMMARY:Git 101
+DESCRIPTION:Presented by Scott Chacon (GitHub). Git is a new distributed
+  version control system that is fast, flexible, works offline and suppor
+ ts powerful local branching and easy merging that encourages non-linear 
+ workflows and makes developers far more productive and efficient. This t
+ utorial will introduce you to Git, rid you of your SVN sins, and teach y
+ ou how to become more efficient and productive as a programmer.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090711T160918
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8345
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8345
+SUMMARY:Request Tracker Boot Camp
+DESCRIPTION:Presented by Jesse Vincent (Best Practical). Request Tracker
+  (RT) is an enterprise-grade ticketing system. It's designed to help you
+ r organization track what needs to get done and what still needs doing. 
+ From basic customer service to advanced back-office workflows, RT is fle
+ xible enough to keep your processes smooth and effective. This tutorial 
+ will cover deployment and day to day use of RT as well as basic customiz
+ ation.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090311T174338
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8904
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8904
+SUMMARY:Running the Show: Configuration Management with Chef
+DESCRIPTION:Presented by Edd Dumbill (O'Reilly Media, Inc. ). Few applic
+ ations are architecturally simple. As soon as you grow, you find yoursel
+ f using multiple subsystems and machines to scale, creating new headache
+ s in configuration management. Help is at hand! This tutorial introduces
+  Chef, a modern Ruby-based open source approach to systems integration. 
+ Chef lets you manage your servers by writing code, not running commands.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090711T160907
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8892
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8892
+SUMMARY:What's new in Perl v5.10?
+DESCRIPTION:Presented by Tom Christiansen (TCPC). Perl5 is alive and wel
+ l, and this tutorial outlines the many significant changes appearing in 
+ the 5.10.0 release and beyond, especially in regular expressions and mod
+ ules.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090629T225426
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8314
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8314
+SUMMARY:Use Open Source Tools to Program iPhone Games on Linux and Windo
+ ws Without the iPhone SDK
+DESCRIPTION:Presented by PJ Cabrera (Freelance trouble-maker). In this t
+ utorial, learn about the use of open source tools to help develop native
+  applications for the iPhone platform on Windows and Linux, and learn ab
+ out the source code of a basic iPhone application in Objective-C. Explor
+ e open source libraries that help accelerate the creation of native iPho
+ ne games and apps without having to use the iPhone SDK directly.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090310T213152
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8117
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8117
+SUMMARY:Scaling Your Web MySQL Application (mostly PHP/MySQL)
+DESCRIPTION:Presented by Duleepa Wijayawardhana (MySQL). Scaling is a pe
+ rennial problem. One day you are happily serving 10,000 users and sudden
+ ly that pesky CNN picks you on you and you have to deal with a million u
+ sers. It isn't all about putting the latest hardware, more disk or more 
+ RAM. Scaling is a subtle art of discovering pain points in the applicati
+ on and using various Open Source software and technologies to get you to
+  where you want.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T170000
+DTSTART;TZID=US/Pacific:20090720T133000
+DTSTAMP:20090629T225018
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8076
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-13:30--8076
+SUMMARY:Distributed Applications with CouchDB
+DESCRIPTION:Presented by J Chris Anderson (couch.io). Apache CouchDB can
+  serve complete web apps, without a middle-tier application server. Beca
+ use these apps can be deployed to any running CouchDB node (including us
+ er's local machines), they present potential for end-user innovation, bu
+ t because of view source but also through peer based replication. We'll 
+ learn to use the CouchApp JavaScript and HTML framework to build sharabl
+ e applications.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T200000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090706T173333
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10160
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10160
+SUMMARY:Private Clouds - Why They Matter
+DESCRIPTION:Clouds of all types have been discussed and new terms seem t
+ o pop up everyday. This BoF will focus in on one aspect of cloud computi
+ ng, namely, private clouds. Enterprises have vast data centers comprisin
+ g of systems of all types. Cloud computing can transform these datacente
+ rs into a flexible, efficient cloud allowing for endless possibility.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T200000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090714T091107
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10216
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10216
+SUMMARY:Open Source to the Rescue  of  Mobile App and Mobile Web Fragmen
+ tation
+DESCRIPTION:Mobile app and Mobile web development is still in it's infan
+ cy when talking about development practices, tools and platform converge
+ nce. Several Open Source projects and standards are emerging in this fie
+ ld. During this BoF session some of the tools and approaches will be dis
+ cussed and experiences will be shared. Special focus will be put on tool
+ s that overcome device fragmentation!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T200000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090623T151234
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10217
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10217
+SUMMARY:Writing Open Source
+DESCRIPTION:Whether you're an aspiring technical author, or a raging Doc
+ Book fiend, you've probably noticed that a lot open source documentation
+  needs help. Want to help (or need help)? Writing Open Source is a new c
+ ross-project initiative dedicated to making docs suck less.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T200000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090715T172147
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10447
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10447
+SUMMARY:collectd and rrdtool, Building Blocks for AMP Monitoring and Vis
+ ualization
+DESCRIPTION:This session intends to showcase the power of collectd and r
+ rdtool to build a monitoring solution for the OpenSolaris Web Stack (an 
+ AMP stack). collectd, a system statistics collection daemon, helps you t
+ o collect and store monitoring statistics while rrdtool, a data logging 
+ and graphing system for time series data, helps you to generate nice gra
+ phs.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T200000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090716T142818
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10347
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10347
+SUMMARY:Hacking the Open GlassFish Web Stack for Laconica - The Open Mic
+ roblogging Tool
+DESCRIPTION:This Birds of a Feather Session will show how to hack the Gl
+ assFish Web Stack to add support for Laconica.  At the end of this sessi
+ on you will be able to download, modify, and compile the Open Web Stack 
+ to support the Laconica Microblogging Tool.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T200000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090707T205237
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10370
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10370
+SUMMARY:Using Open Source to Speed Multi-source Development - Issues and
+  Benefits
+DESCRIPTION:Open source enables a re-alignment of development economics 
+  - enabling faster, more cost-effective product development and time-to-
+ market. Development organizations must gear up for the challenges of usi
+ ng open source. Attendees will discuss new technologies and approaches t
+ hat address the unique challenges that arise when development organizati
+ ons use open source components “at scale.â€
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T210000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090710T165405
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10406
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10406
+SUMMARY:Crossbow Network Virtualization - Convergence of Compute and Net
+ work Services
+DESCRIPTION:There are a lot of solutions in the market for virtualizing 
+ compute services, but what about the network?  Crossbow introduces a new
+  highly performant and scalable networking stack into OpenSolaris with u
+ nique network virtualization and resource control features. This new inf
+ rastructure allows you to combine networking and compute services withou
+ t trading off security or performance.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090720T200000
+DTSTART;TZID=US/Pacific:20090720T190000
+DTSTAMP:20090710T224854
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10413
+UID:http://conferences.oreilly.com/oscon--s2009-07-20-19:00--10413
+SUMMARY:Drill Down PHP Performance on Multicore Systems. Where Does It S
+ tand?
+DESCRIPTION:PHP, in spite of most popular web scripting language, doesn'
+ t perform the best particularly on modern multicore systems. In a standa
+ rd ecommerce workload, PHP perform less than 50% compare to jsp.  We hav
+ e been able to improve the PHP performance up to 60% by optimizing the P
+ HP engine running in a multithreaded environment. In the session we will
+  review some of these optimizations.
+END:VEVENT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/OSCON20090721.ics	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,343 @@
+BEGIN:VCALENDAR
+X-WR-CALNAME:OSCON 2009
+VERSION:2.0
+PRODID:Expectnation
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090711T160325
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8262
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--8262
+SUMMARY:How to Write Your Own Eclipse Plug-ins
+DESCRIPTION:Presented by Beth Tibbitts (IBM ). Eclipse is an open source
+  IDE that has available extensions for a variety of languages and tools.
+   How are these extensions created? This tutorial will cover how to inst
+ all eclipse extensions ("plug-ins"), how to write your own including usi
+ ng the built-in wizards, how to write help for your plug-ins, and how to
+  publish/package them so that others can easily download and use your pl
+ ug-ins.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090311T161032
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7844
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--7844
+SUMMARY:Spatializing your Data with PostGIS, GeoDjango & OpenLayers
+DESCRIPTION:Presented by Chander Ganesan (Open Technology Group, Inc). T
+ he GeoDjango project provides a set of extensions to the python Django f
+ ramework that allows for the easy and rapid development of spatially ena
+ bled applications.  Using GeoDjango's model-driven design methods, PostG
+ IS's spatial database extensions to PostgreSQL, and OpenLayers, we will 
+ explain and demonstrate how to build powerful spatially enabled applicat
+ ions.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090629T230556
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8062
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--8062
+SUMMARY:7 Principles of Better API Design
+DESCRIPTION:Presented by Damian Conway (Thoughtstream). This course pres
+ ents a minimalist approach to interface design known as "S.A.T." Develop
+ ed by Damian Conway over the past decade, this design philosophy can pro
+ duce smaller, better focused, more usable module APIs.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090629T230304
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7519
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--7519
+SUMMARY:Linux System and Network Performance Monitoring
+DESCRIPTION:Presented by Darren Hoch (StrongMail Systems). The Linux Sys
+ tem and Network Performance Course teaches systems administrators practi
+ cal methodologies for monitoring systems using standard system tools. Th
+ e course breaks performance into 4 functional components: CPU, Memory, I
+ /O, and Network.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090310T224022
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7734
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--7734
+SUMMARY:Moose: A Complete (Meta-)OO System for Perl
+DESCRIPTION:Presented by Yuval Kogman (Infinity Interactive). Moose is a
+  complete OO system for Perl that provides a declarative sugar layer alo
+ ng with a complete meta-model for introspection and extension.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090711T160428
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7384
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--7384
+SUMMARY:PHP Code Audit
+DESCRIPTION:Presented by Philippe Gamache (Parler Haut, Interagir Librem
+ ent), Damien Seguy (Alterway Consulting). In this laboratory, we will ca
+ rry out a safety audit of an Open Source web application. We will work o
+ n a real application. The laboratory will end with the handing over of t
+ he report to the authors of the application so they can have an outside 
+ view on the safety of the application.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090711T160317
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8020
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--8020
+SUMMARY:The PhoneGap Project: Designing for the Device Neutral Mobile We
+ b
+DESCRIPTION:Presented by Brian LeRoux (Nitobi Inc.), Rob Ellis (Nitobi I
+ nc.), Brock Whiten (Nitobi Inc.). Created at iPhoneDevCamp 2008, PhoneGa
+ p is an open source initiative for bringing native device capabilities t
+ o mobile browsers. Use PhoneGap to author apps in HTML and JavaScript an
+ d still take advantage of native mobile device capabilities like geo loc
+ ation, camera, vibration and sound. Learn to build apps for iPhone, Andr
+ oid, Nokia S60 and Blackberry and how to contribute back to the project.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090408T163529
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7554
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--7554
+SUMMARY:Practical Erlang Programming Tutorial
+DESCRIPTION:Presented by Francesco Cesarini (Erlang Training and Consult
+ ing Ltd). Practical Erlang Programming covers the basic, sequential and 
+ concurrent aspects of the Erlang programming language. You will learn th
+ e basics of how to read, write and structure Erlang programs. The target
+  audience are software developers and engineers with an interest in serv
+ er side applications and massively concurrent systems. The perquisites a
+ re basic programming knowledge.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090711T160410
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8206
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--8206
+SUMMARY:Gearman: Build Your Own Distributed Platform in 3 Hours
+DESCRIPTION:Presented by Eric Day (Sun Microsystems), Brian Aker (Sun Mi
+ crosystems, Inc.). This tutorial will show you how to get started with G
+ earman, the flexible job queuing system used to power websites such as L
+ iveJournal and Digg. We'll cover common architectures, installation, API
+ s, and deployment. A few use cases will be described and built, includin
+ g a Map/Reduce cluster and database-driven URL mining application.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T120000
+DTSTART;TZID=US/Pacific:20090721T083000
+DTSTAMP:20090323T212845
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8210
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-08:30--8210
+SUMMARY:Building Great User Experiences For the Open Web With Dojo
+DESCRIPTION:Presented by Matthew Russell (Zaffra, LLC). Dojo is an indus
+ trial strength JavaScript toolkit that drastically simplifies the effort
+  it takes to develop an application for the open web. This 3 hour tutori
+ al provides an intense introduction to all of the "good parts" of the to
+ olkit and includes a number of demonstrations built in real time (as opp
+ osed to primarily being a lecture) in the spirit of a "labs style" envir
+ onment.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090310T223652
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8893
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8893
+SUMMARY:Open-Source Solutions for Cameras in the Digital Age
+DESCRIPTION:Presented by Tom Christiansen (TCPC). Now that everyone and 
+ their dog has some sort    of a digital camera, what are you supposed to
+     do with it, and how?  What real solutions are    out there that aren
+ 't just for the subfenestrated?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090311T175417
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8178
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8178
+SUMMARY:Total Security In A PostgreSQL Database
+DESCRIPTION:Presented by Robert Bernier (Consultant). Protecting your da
+ ta, by any and all means possible, is no longer an option. Rather, it is
+  mandated by today's security conscious management. This tutorial will d
+ emonstrate a hands on methodology of using the latest encryption and cip
+ her technology available in PostgreSQL. Following best condoned practice
+ s used in the industry today, PostgreSQL can be used to manage your data
+  securely.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090310T214348
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7943
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--7943
+SUMMARY:Scalable Internet Architectures
+DESCRIPTION:Presented by Theo Schlossnagle (OmniTI). Internet traffic sp
+ ikes aren't what they used to be.  It is now evident that even the small
+ est sites can suffer the attention of the global audience.  This present
+ ation dives into techniques to avoid collapse under dire circumstances. 
+  Looking at some real traffic spikes, we'll pinpoint what part of the ar
+ chitecture is crumbling under the load; then, walk though stop-gaps and 
+ complete solutions.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090629T231001
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8451
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8451
+SUMMARY:Doing Perl Right
+DESCRIPTION:Presented by Paul Fenwick (Perl Training Australia), Jacinta
+  Richardson (Perl Training Australia). You already know some Perl.  You'
+ ve read a book, written a few scripts, maybe even a module, but are you 
+ sure you're doing it right?  Languagues and techniques evolve over time,
+  and Perl is no exception. This detailed tutorial covers many of the bes
+ t modern and practical techniques in Perl, including Moose, autodie, Dev
+ el::NYTProf, Devel::Cover, PAR, Perl::Critic and more.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090629T231146
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7616
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--7616
+SUMMARY:Quality Assurance in PHP Projects
+DESCRIPTION:Presented by Sebastian Bergmann (thePHP.cc). This tutorial i
+ ntroduces the audience to the testing of modern web applications using P
+ HPUnit for testing the backend components and Selenium for end-to-end te
+ sting of the whole application as well as measuring and controlling othe
+ r aspects of software quality throughout a project's lifecycle.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090320T181052
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8327
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8327
+SUMMARY:Becoming an OpenSolaris Power User
+DESCRIPTION:Presented by Nicholas Solter (OpenSolaris / Sun Microsystems
+ ), David Miner (Sun Microsystems). Join the authors of “OpenSolaris Bibl
+ e†for a tutorial in becoming an OpenSolaris power user. Learn about ZFS
+ , DTrace, FMA, SMF, and more.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090310T213100
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8238
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8238
+SUMMARY:Just Enough C For Open Source Projects
+DESCRIPTION:Presented by Andy Lester (theworkinggeek.com). For programme
+ rs raised on open source who want to delve into lower-level mechanics of
+  C programming, this tutorial gives a complete overview of what it takes
+  to jump into the innards of your favorite open source projects. From My
+ SQL to Perl 5 to the Linux core, C is the foundation of many of the most
+  widely used open source packages. Learn the language, learn the tools, 
+ and start contributing.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090717T010624
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10152
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--10152
+SUMMARY:Inside Symbian Tips and Tricks Tutorial
+DESCRIPTION:Presented by Lars Kurth (Symbian), Regan Coleman (Xenient). 
+ The Symbian tutorial is the ideal place to gain insight and hands-on exp
+ erience with the Symbian Mobile Platform using Runtime tools including W
+ eb, Adobe Flash Lite, and Python, as well as an introduction to  native 
+ C++ development. The first 60 attendees will receive their very own unlo
+ cked Nokia 5800 device.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090311T013744
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8159
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8159
+SUMMARY:Django in the Real World
+DESCRIPTION:Presented by Jacob Kaplan-Moss (Django). There's plenty of m
+ aterial (documentation, blogs, books) out there that'll help you write a
+  site using Django... but then what? You've still got to test, deploy, m
+ onitor, and tune the site; failure at deployment time means all your bea
+ utiful code is for naught. This tutorial examines how best to cope when 
+ the Real World intrudes on your carefully designed website.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090629T231133
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8225
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8225
+SUMMARY:Learn to use Semantic Technologies using Open Source Tools
+DESCRIPTION:Presented by Jamie Taylor (Metaweb), Toby Segaran (Metaweb),
+  Colin Evans (Metaweb). Semantic Technologies provide a simple, standard
+ ized methodology for representing, combing and sharing data and serve as
+  the foundation for creating communities of open data.  These technologi
+ es are both easy to learn and easy to use. This tutorial will introduce 
+ you to semantic programming using a variety of open source tools and pro
+ gramming techniques that you can use on your projects today.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T170000
+DTSTART;TZID=US/Pacific:20090721T133000
+DTSTAMP:20090310T220642
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8457
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-13:30--8457
+SUMMARY:Using Drupal
+DESCRIPTION:Presented by James Walker (Lullabot), Addison Berry (Lullabo
+ t). Drupal is a highly modular, Open Source Content Management System wi
+ th a wealth of powerful add-on modules. Learn to harness it all and buil
+ d dynamic websites with Drupal from authors of the book, Using Drupal.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T203000
+DTSTART;TZID=US/Pacific:20090721T193000
+DTSTAMP:20090630T234102
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9010
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-19:30--9010
+SUMMARY:Ignite OSCON
+DESCRIPTION:If you had five minutes on stage what would you say? What if
+  you only got 20 slides and they rotated automatically after 15 seconds?
+  Would you pitch a project? Launch a web site? Teach a hack? We’re going
+  to find out when we try our first Ignite event at OSCON. Damian Conway 
+ is scheduled to end OSCON Ignite in style. Want to present at Ignite?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090721T210000
+DTSTART;TZID=US/Pacific:20090721T203000
+DTSTAMP:20090430T234511
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9000
+UID:http://conferences.oreilly.com/oscon--s2009-07-21-20:30--9000
+SUMMARY:Google O'Reilly Open Source Awards
+DESCRIPTION:Winners of the Google O'Reilly Open Source Award will be ann
+ ounced during this fun evening event.
+END:VEVENT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/OSCON20090722.ics	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,1630 @@
+BEGIN:VCALENDAR
+X-WR-CALNAME:OSCON 2009
+VERSION:2.0
+PRODID:Expectnation
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T091500
+DTSTART;TZID=US/Pacific:20090722T090000
+DTSTAMP:20090422T155324
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9014
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-09:00--9014
+SUMMARY:Welcome
+DESCRIPTION:Presented by Allison Randal (O'Reilly Media, Inc.), Edd Dumb
+ ill (O'Reilly Media, Inc. ). Opening remarks by the OSCON program chairs
+ , Allison Randal and Edd Dumbill.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180000
+DTSTART;TZID=US/Pacific:20090722T090000
+DTSTAMP:20090625T233620
+LOCATION:Meeting Room C1/C4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9001
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-09:00--9001
+SUMMARY:OSCamp 2009
+DESCRIPTION:OSCamp 2009, a community organized event designed to share a
+ nd improve the essential skills required to participate in collaborative
+ , free and open online projects. OSCamp attendance is free with an Expo 
+ Hall pass.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180000
+DTSTART;TZID=US/Pacific:20090722T090000
+DTSTAMP:20090702T000426
+LOCATION:Meeting Room N
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10232
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-09:00--10232
+SUMMARY:Sunlight Labs Hackathon
+DESCRIPTION:At the Sunlight Labs hackathon, Sunlight Labs will be workin
+ g with developers on two major projects: 1. Parsing sites at for our 50 
+ state project to get every state legislature in a common data format, an
+ d 2. Adding data into Sunlight's newest project, Congrelate.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T093000
+DTSTART;TZID=US/Pacific:20090722T091500
+ALTDTSTART;TZID=US/Pacific:20090722T090000
+DTSTAMP:20090615T165620
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9170
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-09:15--9170
+SUMMARY:The O'Reilly Radar
+DESCRIPTION:Presented by Tim O'Reilly (O'Reilly Media, Inc.). Keynote by
+  Tim O'Reilly.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T094500
+DTSTART;TZID=US/Pacific:20090722T093000
+ALTDTSTART;TZID=US/Pacific:20090722T090000
+DTSTAMP:20090617T221507
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10153
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-09:30--10153
+SUMMARY:Intel and Open Source: Innovation and Leadership for Continued G
+ rowth
+DESCRIPTION:Presented by Imad Sousou (Intel Corporation). Imad Sousou, D
+ irector of Intel Open Source Technology Center will present the technolo
+ gy vision and direction for Intel’s overall Open Source efforts, includi
+ ng Mobility, Virtualization, Power, and Performance.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T100000
+DTSTART;TZID=US/Pacific:20090722T094500
+ALTDTSTART;TZID=US/Pacific:20090722T090000
+DTSTAMP:20090501T161347
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9124
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-09:45--9124
+SUMMARY:A Brief History of Software
+DESCRIPTION:Presented by Michael  Lopp (Rands in Repose). In 15 minutes,
+  discover 15 years of secrets behind building software faster, more effi
+ ciently, and using less floppy disks.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T101500
+DTSTART;TZID=US/Pacific:20090722T100000
+ALTDTSTART;TZID=US/Pacific:20090722T090000
+DTSTAMP:20090325T170953
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9015
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:00--9015
+SUMMARY:Q & A
+DESCRIPTION:An open microphone question and answer session with the morn
+ ing's keynote speakers.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090311T194433
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7865
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--7865
+SUMMARY:With Software as a Service, Is Only the Network Luddite Free?
+DESCRIPTION:Presented by Bradley Kuhn (Software Freedom Law Center / Sof
+ tware Freedom Conservancy), Benjamin Mako Hill (MIT Center for Future Ci
+ vic Media), Evan Prodromou (Identi.ca), Nathan Yergler (Creative Commons
+ ), Tim O'Reilly (O'Reilly Media, Inc.). At OSCON 2008, Tim O'Reilly rais
+ ed in his keynote a new challenge we face: Software as a Service.  This 
+ panel discusses the work spawned by autonomo.us to inspire the Open Sour
+ ce and Software Freedom Movement to address the challenge.  The talk wil
+ l discuss the AGPL, a license designed to address these concerns, and th
+ e federated service model that must exist to succeed in addressing this 
+ problem.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090317T130826
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8161
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8161
+SUMMARY:Conferences for Beginners
+DESCRIPTION:Presented by Jim Brandt (Synacor, Inc.). While the OSCON con
+ ference materials are a great resource, much of the benefit from OSCON c
+ omes from the hallway track. This talk will educate first-timers on how 
+ to get the most out of OSCON.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090612T213025
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8215
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8215
+SUMMARY:Btrfs: A new Linux file system
+DESCRIPTION:Presented by Valerie Aurora (formerly Henson) (Red Hat, Inc.
+ ). Btrfs is a new file system for Linux.  It includes snapshots, pooling
+  of multiple devices, and checksums.  This talk will describe btrfs for 
+ both the systems administrator and the programmer.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090311T045122
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7872
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--7872
+SUMMARY:Zen and the Art of Abstraction Maintenance
+DESCRIPTION:Presented by Alex Martelli (Google). Abstraction is a powerf
+ ul servant, but a dangerous master.  We code, design, think, debug ... o
+ n a tower of abstractions. Spolsky's Law tells us that "All abstractions
+  leak". This talk explores why they leak, why that's often a problem, wh
+ at to do about it; I also cover why sometimes abstractions SHOULD "leak"
+ , and how best to produce and consume abstraction layers.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090527T172713
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8139
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8139
+SUMMARY:How Not to Use Memcached
+DESCRIPTION:Presented by Jonathan Steinert (SixApart). Many people know 
+ how to use memcached, the popular caching system powering much of web1+.
+   Most folks, though, don't know how not to use it, and how improper usa
+ ge can cause data problems, poor site/application performance, and an in
+ credibly grumpy DBA.  Learn what memcached is good for, and what it's no
+ t good for from those that have learned the wrong way.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090311T115817
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7823
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--7823
+SUMMARY:Release Mismanagement: How to Alienate Users and Frustrate Devel
+ opers
+DESCRIPTION:Presented by Hyrum Wright (University of Texas at Austin). T
+ o most users, unreleased software is non-existent software.  Even when t
+ he source code is freely available, most users desire, or even require, 
+ releases which are provided and blessed by the project.  In this talk, I
+ 'll discuss release management, who does it, how it's done, and what hap
+ pens when things go wrong.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090310T214406
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7931
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--7931
+SUMMARY:Reconnoiter: Monitoring and Trend Analysis
+DESCRIPTION:Presented by Theo Schlossnagle (OmniTI). Monitoring systems 
+ to collect metrics is systems administration 101.  However, systems are 
+ more complicated, there are more metrics and correlation is a must to tr
+ oubleshoot problems or plan for growth.  As our problem got bigger, our 
+ tools didn't get better.  Reconnoiter is a large-scale monitoring and tr
+ end analysis system designed to nip these problems in the bud.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090310T213328
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8382
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8382
+SUMMARY:Grokkin' Design
+DESCRIPTION:Presented by Jon Tan (OmniTI). Design is 80% science and 20%
+  art. This talk dives straight into the science to give you the techniqu
+ es to create your own interfaces and demystify design. From using the go
+ lden ratio in layout and Fibonacci numbers in typography, to brand desig
+ n and art direction, it covers it all in simple, tasty, bite-size pieces
+ .
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090310T235716
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8138
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8138
+SUMMARY:Educating Students in 21st Century Skills via FOSS
+DESCRIPTION:Presented by Bryant Patten (National Center for Open Source 
+ and Education). The new U.S. technology standards for K-12 schools are a
+ ll about 21st Century Skills - problem solving, collaboration, authentic
+  work.  This talk, targeted at FOSS project leaders and community manage
+ rs, is about getting students to contribute to Open Source software proj
+ ects and how FOSS projects can help with this effort.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090415T180635
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8843
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8843
+SUMMARY:Building Applications Using Ubuntu One
+DESCRIPTION:Presented by Stuart Langridge (Canonical). Ubuntu One isn't 
+ just a set of services for Ubuntu, it's a platform for you to build your
+  own services too. Stuart Langridge explains the APIs Ubuntu One offers 
+ to developers and shows some examples of applications you could build th
+ at take advantage of storage in the cloud and synchronised databases for
+  your apps: build your own on the desktop or the web to work collaborati
+ vely with Ubuntu One.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090529T205411
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9907
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--9907
+SUMMARY:How to Develop Moblin Core Technologies
+DESCRIPTION:Presented by Rob Bradford (Intel). Moblin has been talked ab
+ out a lot in the last few months. By the time OSCON comes around, the re
+ lease of Moblin 2.0 should be close. This talk will give an update on wh
+ ere Moblin is and where it is going.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090507T163801
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9258
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--9258
+SUMMARY:Development Principles of Liferay's Expanse UI Framework
+DESCRIPTION:Presented by Nate Cavanaugh (Liferay, Inc.). The number of q
+ uality open source JS frameworks leads to an interesting question: Why d
+ id Liferay build Expanse UI? This session will cover not only the motiva
+ tions and technical hurdles it was designed to overcome, but also the de
+ velopment principles it adheres to in building a complete UI solution.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090407T194156
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8552
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8552
+SUMMARY:Building Belonging
+DESCRIPTION:Presented by Jono Bacon (Canonical Ltd). In his new talk Bui
+ lding Belonging, Jono Bacon explores the underlying recipe behind what m
+ akes great community and talks about many of the concepts that he and hi
+ s team have used as part of the Ubuntu community. The presentation takes
+  a fun, amusing and anecdote laden tour-de-force of community in a way t
+ hat any community can implement. Be sure to be there!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090311T004452
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8179
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8179
+SUMMARY:MVCs in Perl, Too Many Ways To Do It!
+DESCRIPTION:Presented by Jacinta Richardson (Perl Training Australia). E
+ veryone else is using Model-View-Controller (MVC) frameworks to create t
+ heir websites, but Perl has so many!  How is an MVC-novice to choose bet
+ ween Catalyst, Jifty, Gantry, Maypole or many of the others?  Come along
+  for a whirlwind tour of these frameworks and more and see their strengt
+ hs, their failures and make an informed decision about which one you'll 
+ use for your next project.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T113000
+DTSTART;TZID=US/Pacific:20090722T104500
+DTSTAMP:20090312T231305
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8073
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-10:45--8073
+SUMMARY:Testing iPhone apps with Ruby and Cucumber
+DESCRIPTION:Presented by Ian Dees (Tektronix). The iPhone and the Cucumb
+ er test framework have something in common, besides the adoration of gee
+ ks.  They're both designed to get out of your way, so you can think abou
+ t the task at hand.  So it's only natural that we'd want to use our favo
+ rite framework to drive apps on our favorite phone.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090715T233328
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8057
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8057
+SUMMARY:Even Faster Websites
+DESCRIPTION:Presented by Steve Souders (Google), Lindsey Simon (Google).
+  Steve Souders, author of High Performance Web Sites and creator of YSlo
+ w, discusses his new insights into faster web pages including how to loa
+ d JavaScript asynchronously, optimizing CSS, and sharding resources acro
+ ss multiple domains.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090317T195103
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8789
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8789
+SUMMARY:Getting Started in Free and Open Source
+DESCRIPTION:Presented by Cat Allman (Google), Leslie Hawthorn (Google, I
+ nc.). Leslie Hawthorn and I co-present this talk for beginners who are i
+ nterested to getting involved but don't know where or how to start.  We 
+ cover the basics of: -why you might want to get involved -what you can g
+ et out of participating -more than coding is needed -how to chose a proj
+ ect -how to get started -etiquette of lists and other communication -dos
+  and don't of joining a community
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090320T032040
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8438
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8438
+SUMMARY:The Future of Filesystems and Storage
+DESCRIPTION:Presented by Theodore Ts'o (Linux Foundation). What does the
+  future hold in store for filesystem and storage technologies?  Why is i
+ t that there has been a flowering of new filesystems showing up in Linux
+  in the last 18 months?   This talk will review the new file systems and
+  storage technologies which have shown up in Linux and discuss what is l
+ ikely to come in the future.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090310T213853
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8198
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8198
+SUMMARY:Gearman: Bringing the Power of Map/Reduce to Everyday Applicatio
+ ns
+DESCRIPTION:Presented by Eric Day (Sun Microsystems), Brian Aker (Sun Mi
+ crosystems, Inc.). Come learn the fundamentals of how to leverage Gearma
+ n, the open-source, distributed job queuing system. Originally designed 
+ to scale LiveJournal.com, Gearman is now faster than ever and can help y
+ ou build your own scalable applications. Gearman's generic design allows
+  it to be used as a building block for almost any use - from speeding up
+  your website to building your own Map/Reduce cluster.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090310T221241
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8333
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8333
+SUMMARY:Distributed Bug Tracking with SD
+DESCRIPTION:Presented by Jesse Vincent (Best Practical). SD is a disconn
+ ected, replicated bug tracking system designed to let developers track a
+ nd resolve bugs without sacrificing the flexibility of the modern workfl
+ ows that distributed version control systems have made possible.  This t
+ alk will teach you how to start becoming more productive with SD without
+  giving up your existing bug tracker.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090708T162549
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8468
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8468
+SUMMARY:Virtualize vs Containerize: Fight!  Why the Biggest Virtualizati
+ on Technologies Aren't Always the Best Choice
+DESCRIPTION:Presented by Irving Popovetsky (Irving Popovetsky Consulting
+ ). Everyone has a reason to love virtualization: security, configuration
+  isolation... the list goes on. But containerization offers many of the 
+ same goodies as virtualization, alongside an efficiency and performance 
+ advantage. Just what you need, more options. There's no wrong answer. An
+ dy de la Lucha and Irving Popovetsky help you ask the right questions ab
+ out what's right for your environment.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090604T214930
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7982
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--7982
+SUMMARY:The Linux Defenders: Stop the Trolls, Protect Linux, Further Inn
+ ovation
+DESCRIPTION:Presented by Keith Bergelt (Open Invention Network). Open In
+ vention Network (OIN) has collaboratively unveiled the free Linux Defend
+ ers program, which is designed to make prior art more readily accessible
+  to patent and trademark office examiners, as well as increase the quali
+ ty of granted patents and reduce the number of second-rate patents. Keit
+ h Bergelt, CEO of OIN, will demonstrate how to use the program and discu
+ ss its benefits.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090310T213841
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7593
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--7593
+SUMMARY:New Ways for Teaching Children Software Programming
+DESCRIPTION:Presented by Howard Abrams (Joule Labs). Software programmin
+ g has come a long way for students and younger children since the days o
+ f Logo. Syntax has been replaced with connecting blocks and the triangle
+  turtle has been replaced with custom artwork children create themselves
+ . Now, multi-threading and event processing are easier to teach children
+  than functions, and this session discusses these ideas as well as so th
+ e edge of kid code.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090414T190527
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8808
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8808
+SUMMARY:Industrialization of OBM in Ubuntu
+DESCRIPTION:Presented by Sylvain Garcia (LINAGORA). It is not an easy ta
+ sk to integrate an OpenSource solution in an enterprise. We'll show you 
+ how you can turn a successful OS project into an enterprise-grade produc
+ t. We'll share our experience with industrialization and virtualization 
+ of a big OS project, how we built ubuntu packages, how we included our p
+ roject in the Ubuntu distribution and how we use virtualization to devel
+ op our product.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090520T162210
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9399
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--9399
+SUMMARY:A Guide to Free, Self-hosted Online Video Apps
+DESCRIPTION:Presented by Shay David (Kaltura). Video lovers of the world
+  unite. Shay will present the world's first full open source video solut
+ ion stack (used by Wikipedia and 27,000 other publishers), and demo seve
+ ral self-hosted video applications. He’ll walk through technicalities of
+  setting up an online video platform, discuss pros  and cons of self-hos
+ ted versus SaaS, and even dive into some code.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090625T170111
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10225
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--10225
+SUMMARY:Interoperability - Build Mission Critical Applications in PHP, R
+ uby, Java and Eclipse Using Microsoft Software and Services
+DESCRIPTION:Presented by Vijay Rajagopalan (Microsoft). Microsoft has de
+ livered multiple technologies that focus on interoperability with non-Mi
+ crosoft and Open Source technologies. Learn how to use the Eclipse tools
+  today to build Silverlight applications that run on PCs and Macs; how t
+ o develop using combinations of PHP, Java and Ruby in addition to the st
+ andard Microsoft languages.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090310T223705
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8403
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8403
+SUMMARY:ElectionAudits: a Django App for Advanced Election Auditing
+DESCRIPTION:Presented by Neal McBurnett (Internet2). The open source Ele
+ ctionAudits software was used in Boulder Colorado's groundbreaking elect
+ ion audit in 2008.  Recent advances in auditing practices can help incre
+ ase confidence in elections.  This new Django-based app ties together vo
+ ter-verified paper ballots, batch reporting, verifiably random selection
+  of batches, hand counts, and statistical analysis.  Come, and help audi
+ t in your state!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090323T213732
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7941
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--7941
+SUMMARY:State-of-the-art Profiling with Devel::NYTProf
+DESCRIPTION:Presented by Tim Bunce (TigerLead). Devel::NYTProf has revol
+ utionized profiling perl code. Making accurate and detailed performance 
+ data available for the first time, and in richly annotated and inter-lin
+ ked HTML reports. Come and learn how NYTProf can shed light on the perfo
+ rmance hot spots in your code.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T122000
+DTSTART;TZID=US/Pacific:20090722T113500
+DTSTAMP:20090409T184505
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8108
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-11:35--8108
+SUMMARY:Introduction to Animation and OpenGL on the Android SDK
+DESCRIPTION:Presented by Satya Komatineni (Active Intellect, Inc.). Hand
+ held is the new personal computer. The open sourced handheld plaftform, 
+ Android SDK, presents a great opportunity for programmers all around the
+  world to make an impact on education and entertainement. This session w
+ ill take you through the Animation and OpenGl capabilities of the Androi
+ d SDK to get you started on a path of innovation.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090604T162322
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7413
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--7413
+SUMMARY:Green Computing for the Little Guys: What Can a Fortune 2000 Com
+ pany Do To Green Their Centralized Computing Resources?
+DESCRIPTION:Presented by James Turner (O'Reilly Media), Bill Weihl (Goog
+ le, Inc.), Jim Oberholtzer (United States Bowling Congress), Allyson Kle
+ in (Intel Corporation). Large data center providers such as Google and M
+ icrosoft are taking significant steps to cut down their power and coolin
+ g requirements, but how about a typical company with a campus-sized data
+  center?  What can be done to make a server room full of rack-mounted 1U
+  systems more efficient?  Does virtualization hold the key?  Are more co
+ res better than less?  Our panelists will clue you in.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090312T031828
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8213
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8213
+SUMMARY:Bug Fixing for Everyone
+DESCRIPTION:Presented by Akkana Peck (*). One of the most commonly menti
+ oned benefits of open source is: "Users can fix bugs themselves!" But wh
+ at if you aren't a programmer? This talk will take non-programmers throu
+ gh the basics of searching bug reports, filing good bugs, tracking down 
+ what's causing a bug, and maybe even fixing it yourself, all without any
+  prior programming experience.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090310T213127
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8370
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8370
+SUMMARY:Simplify Packaging with openSUSE Build Service
+DESCRIPTION:Presented by Joe Brockmeier (Novell). Creating packages for 
+ all major Linux distros can be a snap with the openSUSE Build Service. L
+ earn how to create RPMs and Debian Packages, custom distributions, or ev
+ en run your own build service instance.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090310T214058
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7461
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--7461
+SUMMARY:Programmer Insecurity and the Genius Myth
+DESCRIPTION:Presented by Ben Collins-Sussman (Google, Inc.), Brian Fitzp
+ atrick (Google, Inc.). A pervasive elitism hovers in the background of c
+ ollaborative software development:  everyone secretly wants to be seen a
+ s a genius.  In this talk, we discuss how to avoid this trap and gracefu
+ lly exchange personal ego for personal growth and super-charged collabor
+ ation.  We'll also examine how software tools affect social behaviors, a
+ nd how to successfully manage the growth of new ideas.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090318T002405
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7950
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--7950
+SUMMARY:Full Text Search with Sphinx
+DESCRIPTION:Presented by Peter Zaitsev (MySQL Performance Blog). Sphinx 
+ Full Text search engine became increasingly popular over years powering 
+ search for number of Alexa 100 sites  as Craigslist and NetLog.  Sphinx 
+ combines powerful  full text search features with ease of use and high p
+ erformance.  Being specially designed for indexing database content it i
+ s natural fit for modern database powered web sites.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090310T231038
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8400
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8400
+SUMMARY:Getting it Done
+DESCRIPTION:Presented by Wez Furlong (Message Systems). Stressing out ab
+ out meeting deadlines for delivering software? A good development proces
+ s can make a world of difference to the quality of your work and work en
+ vironment. I'd like to share my experiences and tell you about the proce
+ ss that I use to manage my development teams at Message Systems.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090311T205758
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8410
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8410
+SUMMARY:Automating System Builds and Maintenance with Cobbler and Puppet
+DESCRIPTION:Presented by Eric Mandel (BlackMesh), Jason Ford (BlackMesh)
+ . Quickly, accurately, and reliably deploying new systems, across the en
+ tire spectrum of production, test, and development systems, is a constan
+ t challenge for system administrators and developers.  We leveraged Cobb
+ ler and Puppet to overcome these challenges and will show attendees how 
+ they can use Cobbler and Puppet to quickly, accurately, and reliably dep
+ loy new systems.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090326T000947
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7507
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--7507
+SUMMARY:User Interface Year 2020
+DESCRIPTION:Presented by Robin Rowe (Linux Plus Magazine). In the Year 2
+ 020 the user interface will look completely different from today. What w
+ ill that be and how can FOSS lead the way?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090317T133740
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8365
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8365
+SUMMARY:Open Source and Democracy - Creating transparent, trustworthy vo
+ ting systems
+DESCRIPTION:Presented by James Tillman (Elections by the People Foundati
+ on, Inc.), Richard Benham (Elections by the People Foundation, Inc.). Ov
+ er the last few years, developments in the use of Open Source for creati
+ ng efficient, verifiable, and trustworthy voting systems present viable 
+ approaches to solving technical problems in elections systems.  The next
+  wave of development will build on these recent achievements in the fiel
+ d by integrating them into the real, often messy, world of election admi
+ nistration and law.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090404T185848
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7837
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--7837
+SUMMARY:Building a Private Cloud with Ubuntu Server
+DESCRIPTION:Presented by Rick Clark (Canonical USA), Søren Hansen (Canon
+ ical Ltd.). A discussion and demonstration on building and managing a pr
+ ivate cloud using Ubuntu Server, and Eucalyptus
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090616T225603
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10193
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--10193
+SUMMARY:Collaboration as a Business Function
+DESCRIPTION:Presented by Brent McConnell (Novell). With collaboration an
+ d community tools like blogs, wikis, forums, tagging, and rating systems
+ , the enterprise has become filled with collaboration tools to enable pr
+ oductivity. However, the lack of integration in all these platforms crea
+ tes not only Data Silos but Collaboration Silos.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090619T215349
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10213
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--10213
+SUMMARY:Open Source Telephony in a Connected World
+DESCRIPTION:Presented by Nagarajan Guru (Intel), Denis Kenzior (Intel). 
+ As open source became mainstream and open source grew in the offering of
+  applications, frameworks and system software, telephony platform and te
+ lephony frameworks in the open source did not exist until recently. In t
+ his session we will show you the how to of developing Linux telephony ap
+ plications using Ofono and share with you the under-the-hood workings of
+  a cellular telephony software stack.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090506T185508
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8308
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8308
+SUMMARY:Innovative Interaction Using wiiMotes
+DESCRIPTION:Presented by John Harrison (Insight Industries), Matthew Har
+ rison (Insight Industries). wiiMote headtracking demos are a YouTube sen
+ sation and the technology is making its way from demos to production gam
+ es and scientific visualization. Learn the theory behind wiiMote headtra
+ cking, see it in action, and imagine what you might do with it.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090311T225215
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8059
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8059
+SUMMARY:Perl 6 Update
+DESCRIPTION:Presented by Larry Wall (Netlogic Microsystems), Damian Conw
+ ay (Thoughtstream). Larry Wall and Damian Conway will present the latest
+  features of Perl 6, and discuss the on-going implementation of the new 
+ Perl.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T143000
+DTSTART;TZID=US/Pacific:20090722T134500
+DTSTAMP:20090311T110247
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8082
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-13:45--8082
+SUMMARY:GNOME Mobile
+DESCRIPTION:Presented by Dave Neary (Neary Consulting). GNOME Mobile is 
+ a collection of community projects which are at the heart of an increasi
+ ng number of mobile Linux platforms. We will present the genesis of the 
+ initiative, the state of the art, and our plans for the project, as we b
+ ecome increasingly relevant to free software mobile developers.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090311T174202
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7388
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--7388
+SUMMARY:Open Source / Open Government
+DESCRIPTION:Presented by Danese Cooper (Open Source Initiative and REvol
+ ution Computing), Greg Elin (Sunlight Foundation), Brian Behlendorf (sel
+ f), Silona Bonewald (League Of Technical Voters), Michael Tiemann (Open 
+ Source Initiative). Panel of movers and shakers in the movement to open 
+ government using the principals of Open Source.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090310T213150
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7885
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--7885
+SUMMARY:Putting It All Together: Contributing to Open Source Projects
+DESCRIPTION:Presented by Justin Erenkrantz (The Apache Software Foundati
+ on). In most open-source projects, often left unsaid is how to effective
+ ly contribute within the accepted "societal norms" of a project.  Do not
+  become a poisonous person and instead learn how to constructively contr
+ ibute to your favorite open source project!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090310T214156
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8055
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8055
+SUMMARY:Tracking Package Freshness
+DESCRIPTION:Presented by Scott Shawcroft (University of Washington). Com
+ e find out which distribution is best... at keeping their official repos
+ itories up to date.  Or which distribution has the most up to date LAMP 
+ packages.  This presentation explores trends culled from package release
+ s since October '08, discusses the challenge of making sense of it all a
+ nd possible improvements to distribution and package maintenance.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090310T231420
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8217
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8217
+SUMMARY:Living on the Edge
+DESCRIPTION:Presented by Danny O'Brien (Electronic Frontier Foundation).
+  Why do we trust our most personal diary entries with only our closest f
+ riends -- and distant machines of a faceless social networking service? 
+ Why do you hand over to Amazon files and passwords that you wouldn't tel
+ l your own mother? EFF's Danny O'Brien explains why innovation still com
+ es from the edge of our networks -- and how the next generation of free 
+ software will help.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090701T165951
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7607
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--7607
+SUMMARY:What You Need to Know About Rails3
+DESCRIPTION:Presented by Yehuda Katz (Engine Yard Inc.). In December, Ra
+ ils announced it would merge with Merb, and that they would be working t
+ ogether to bring many of the salient elements of Merb into the next vers
+ ion of Rails. Yehuda Katz, the maintainer of Merb (now on the Rails core
+  team), will walk you through what's new, with a special focus on modula
+ rity, performance, and a clean plugin API, three new points of focus for
+  the framework
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090418T020503
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8039
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8039
+SUMMARY:CMake/CTest/CDash/CPack  - Build, Test, and Deploy Software in a
+  Cross-Platform Development Environment
+DESCRIPTION:Presented by William Hoffman (Kitware Inc). CMake is a popul
+ ar cross-platform, open-source build system used by KDE and many other p
+ rojects.  CMake builds software using a set of simple platform independe
+ nt configuration files. CMake generates native makefiles and workspaces 
+ targeted many popular compiler environments. CMake is actually a family 
+ of tools that can be used to build (CMake), test (CTest/CDash) and deplo
+ y (CPack) software.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090409T175134
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8472
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8472
+SUMMARY:Server Management & Source Control: The key to scalability and t
+ eamwork
+DESCRIPTION:Presented by Lance Albertson (Oregon State University Open S
+ ource Lab). Keeping track of configuration changes between hundreds of s
+ ervers is a challenging task not to mention keeping a history of all the
+  changes that were made. This session focusing on utilizing open source 
+ technology to not only help you manage your servers but it also promote 
+ teamwork and self documentation. I'll focus on how the OSU Open Source L
+ ab uses cfengine and git to manage their servers.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090325T080647
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8401
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8401
+SUMMARY:Ten Usability Epiphanies for Your Open Source Web-app
+DESCRIPTION:Presented by Sigurd Magnusson (SilverStripe). Web 2.0, Ajax,
+  usability, and thoughtful graphic design are now commonplace, but open 
+ source web applications are lagging behind. Learn techniques that will m
+ ake your project easier to use, more productive, less prone to user-frus
+ tration, and more successful.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090310T225802
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8413
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8413
+SUMMARY:Transparent Sharing of Complex Data with YAML
+DESCRIPTION:Presented by Ingy döt Net (Hackers, Inc). YAML is the serial
+ ization language that enables sharing of complex data between Perl, Pyth
+ on, Ruby, PHP and Java. It does it so in a human friendly manner. Many p
+ opular frameworks use YAML, including Ruby on Rails. In this talk, Ingy 
+ döt Net, one of the authors of the YAML specification, will show you how
+  to share data objects not feasible by JSON or XML.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090403T235114
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8191
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8191
+SUMMARY:Where'd my Files Go? A guide to Modern Ubuntu Distributions
+DESCRIPTION:Presented by Kyle Rankin (QuinStreet, Inc.). While you might
+  not be able to tell at a glance, a lot has changed behind the scenes on
+  a modern Ubuntu system. For instance, did you know Ubuntu is phasing ou
+ t System V init and has already replaced the init binary? In this talk K
+ yle discusses the current changes Ubuntu is making to what we might cons
+ ider the traditional Linux system.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090630T211204
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10278
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--10278
+SUMMARY:Sun GlassFish (OpenSolaris) Web Stack - The Next Generation Open
+  Web Infrastructure
+DESCRIPTION:Presented by Murthy Chintalapati (Sun Microsystems Inc.), Jy
+ ri Virkki (Sun Microsystems). The OpenSolaris Web Stack is an open sourc
+ e project consists of popular  open source web infrastructure (known as 
+ LAMP or SAMP) technologies,  such as Apache HTTPd, PHP, Python, MySQL, l
+ ighttpd, as well as GlassFish  and Tomcat. As a fully integrated in the 
+ OpenSolaris operating system,  Web Stack delivers close integration with
+  OpenSolaris innovations such  as DTrace, ZFS, SMF and RBAC.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090713T174407
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10438
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--10438
+SUMMARY:The State of SourceForge
+DESCRIPTION:Presented by Ross Turk (SourceForge, Inc.). Campaigning for 
+ wider adoption of open source, Ross attends conferences around the world
+ , represents SourceForge in multiple industry consortia and professional
+  groups, and makes open source software a little more fun through innova
+ tive programs like the Community Choice Awards.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090323T204625
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8317
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8317
+SUMMARY:Best practices for 'scripting' with Python 3
+DESCRIPTION:Presented by Matthew Harrison (Insight Industries). Sure you
+  it's easy to throw a script over the fence for your users, but how do y
+ ou deal with maintenance, testing, packaging and distributing your scrip
+ ts?  This talk will cover best practices for python scripting including 
+ any changes needed for version 3.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090325T211627
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8582
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8582
+SUMMARY:Hacking Rakudo Perl
+DESCRIPTION:Presented by Patrick Michaud (pmichaud.com). This talk prese
+ nts ways in which people can become active contributors to Perl 6 and Ra
+ kudo Perl.  It presents the details needed to quickly become a Rakudo Pe
+ rl and Perl 6 library developer.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T152000
+DTSTART;TZID=US/Pacific:20090722T143500
+DTSTAMP:20090310T233457
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8360
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-14:35--8360
+SUMMARY:Making Test Frameworks Mobile - How to Stuff a 900lb Gorilla int
+ o a Smartphone
+DESCRIPTION:Presented by Clint Talbert (Mozilla), Joel Maher (Mozilla). 
+ The Mozilla project has six test frameworks with over 100,000 combined t
+ ests. For the Fennec mobile Firefox project, we coerced those frameworks
+  to run on Maemo, Windows Mobile, and Symbian platforms.  We will cover 
+ the challenges we faced and the lessons we learned.  Come find out how w
+ e did it and how to apply these ideas to your next mobile project.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090310T213128
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8384
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8384
+SUMMARY:Bureaucrats, Technocrats and Policy Cats: How the Government is 
+ turning to Open Source, and Why.
+DESCRIPTION:Presented by Deborah Bryant (OSU Open Source Lab), Bjorn Fre
+ eman-Benson (DemocracyLab), Greg Lund-Chaix (Oregon State University Ope
+ n Source Lab), Clay Johnson (Sunlight Labs), Aleksandar Totic (Open Sour
+ ce Digital Voting Foundation). Open source shares critical values with g
+ overnment and public education that make them function in the ideal; mer
+ itocracy of ideas, transparency, collaboration. But where is the sweet s
+ pot in the confluence of these social, technical, and public policy idea
+ ls? And where is the opportunity for the citizen developer to get involv
+ ed?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090310T231927
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8085
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8085
+SUMMARY:Stand Up to the Lawyers -- Open Source Licensing and Intellectua
+ l Property Law 101 for Developers
+DESCRIPTION:Presented by Donald Smith (The Eclipse Foundation). Have you
+  ever had a manager or legal department slow down your project why they 
+ try to figure out software licensing issues?  This session will arm you 
+ with all the key information you need to join the conversation and recog
+ nize when your lawyer is trying to pull a fast one, versus when you’re f
+ acing a legitimate challenge.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090311T054730
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8371
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8371
+SUMMARY:Hacking your Portable Linux Server
+DESCRIPTION:Presented by Federico Lucifredi (SUSE team,  Novell). Hackin
+ g the Western Digital Mybook II to transform this elegant external hard 
+ drive into a bare-bones, extremely flexible hardware platform, in a revi
+ val of what we did with the Linksys WRT54G a few years ago. Intermediate
+  system skills (particularly Perl and Shell) recommended, along with ima
+ gination and the desire to have fun!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090323T210250
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8465
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8465
+SUMMARY:Antifeatures
+DESCRIPTION:Presented by Benjamin Mako Hill (MIT Center for Future Civic
+  Media). This talk provides a humorous description of an argument in fav
+ or of free and open source software based on what I call "antifeatures:"
+  functionality that technology developers charge users to not include. F
+ rom DRM to crippled OSes to digital cameras, I will show off many of the
+  most egregious antifeatures and describe how open source both makes the
+ m impossible and helps users work around them.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090310T213139
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7378
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--7378
+SUMMARY:Using Hadoop for Big Data Analysis
+DESCRIPTION:Presented by Mike Olson (Cloudera). Hadoop is a powerful ope
+ n source tool for analyzing large volumes of data.  I'll provide an over
+ view of Hadoop's architecture and describe some real-world use cases.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090310T221202
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8216
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8216
+SUMMARY:Embracing Forks: How Git Changes Open Source Contribution
+DESCRIPTION:Presented by Tom Preston-Werner (GitHub). Git is a distribut
+ ed version control system with easy branching that has forever changed t
+ he way that open source projects accept contributions. By embracing a pa
+ ttern of casual forking, the barrier to submit patches and track upstrea
+ m changes is reduced, resulting in an explosion of contributors and patc
+ hes. This talk will use case studies to illustrate how your project can 
+ enjoy these benefits.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090706T173909
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8972
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8972
+SUMMARY:R we f#¢$ed? Why We Don't Understand Risk, and How it Dooms Us A
+ ll
+DESCRIPTION:Presented by Danese Cooper (Open Source Initiative and REvol
+ ution Computing), David Smith (REvolution Computing). Risk and chance pl
+ ay a huge part in our daily lives, yet the human brain doesn't come pre-
+ loaded with the right software to make intuitive decisions about them. T
+ his talk is to provide some illumination in the basic principles to help
+  you understand and quantify risk, and to introduce you to the open-sour
+ ce language R, an essential tool for finding statistical solutions to yo
+ ur own problems.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090311T045701
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8028
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8028
+SUMMARY:Sex and Design Axioms
+DESCRIPTION:Presented by Juhan Sonin (Involution Studios). Sex and Desig
+ n Axioms describes the minimal rule set for designing interfaces: the fo
+ undational concepts that are required knowledge for designers and engine
+ ers to create usable and elegant interfaces. It is the analog for The El
+ ements of Style by Strunk and White on user interface that encompasses l
+ ayout, interaction, visual design, and prototyping tenets.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090310T224645
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8432
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8432
+SUMMARY:Linux Filesystem Performance for Databases
+DESCRIPTION:Presented by Selena Deckelmann (PostgreSQL Project). How do 
+ you choose the right filesystem for your database management system? Adm
+ inistrators have a variety of filesystems to choose from, as well as vol
+ ume management and hardware or software RAID. This talk will examine how
+  different the performance of filesystems really are, and how do you go 
+ about systematically determining which configuration will be the best fo
+ r your application and hardware.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090604T162724
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8621
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8621
+SUMMARY:A Survey of Ubuntu Server in the Enterprise
+DESCRIPTION:Presented by Nick Barcet (Canonical UK Ltd). A recent survey
+  conducted by the Ubuntu Server community jointly with Canonical and Red
+ monk delivers some great insights on why more and more enterprises are c
+ hoosing Ubuntu Server Edition for their deployments and what workloads a
+ re being used. This talk will discuss the survey findings and propose so
+ me conclusions.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090714T175949
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10369
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--10369
+SUMMARY:The Cloud: OSS Business Model 3.0
+DESCRIPTION:Presented by Jeff Lawson (Twilio). Open source-based busines
+ ses have successfully relied a small but reliable set of business models
+ , including the support model and the freemium model.  More recently, co
+ mpanies have discovered that the Cloud offers a new monetization model, 
+ focused on reliability, scalability and simplified configuration.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090715T204601
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10451
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--10451
+SUMMARY:The Power of Cloud API's
+DESCRIPTION:Presented by Alex Polvi (Cloudkick), Michael Mayo (ioffer.co
+ m), Erik Carlin (Rackspace). Coming soon!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090310T222907
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7370
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--7370
+SUMMARY:Using Windmill
+DESCRIPTION:Presented by Adam Christian (Slide Inc.). Windmill is the be
+ st-integrated solution for Web test development and its success is large
+ ly due to its involved Open Source Community. This talk will get you wri
+ ting and running automated tests and show off some of the most useful bu
+ ilt-in tools for debugging and continuous integration.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090314T012857
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8224
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8224
+SUMMARY:UTF8, Perl and You
+DESCRIPTION:Presented by Rafael Almeria (Xerox). Do you have a website w
+ ritten in Perl that you need to migrate to UTF-8? Here are some importan
+ t details that you need to know in order to achieve that goal.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T171500
+DTSTART;TZID=US/Pacific:20090722T163000
+DTSTAMP:20090311T184157
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8814
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-16:30--8814
+SUMMARY:Building an Atom-enabled Map-driven Location-aware Web-centric M
+ obile Application with POJOs and Android
+DESCRIPTION:Presented by Tim Bray (Sun Microsystems, Inc.). The good new
+ s is that you can do what the title says, and pretty easily too. The eve
+ n better news is that the platform and market are radically open. There 
+ are some warts and some bad news too; this talk is a personal narrative 
+ covering the lessons, pleasing and painful, learned in the course of my 
+ first hands-on Android project.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090528T164026
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8453
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8453
+SUMMARY:Hacking the Open Government
+DESCRIPTION:Presented by Adina Levin, Debra Bowen (State of California),
+  Silona Bonewald (League Of Technical Voters), Kevin Marks (Google), Ila
+ n Rabinovitch (Geek-PAC). This panel will discuss accessing open governm
+ ent initiatives and creating new services around existing government dat
+ a on the internet. The idea is to get a point of view from each step of 
+ the process for open government initiatives, from producer and publisher
+ , to standards advocate, to consumer and user, and to elected representa
+ tive.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090310T214051
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8352
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8352
+SUMMARY:Business Models for Open Source Developers
+DESCRIPTION:Presented by Darrius Thompson (OpenCandy, Inc.). There are m
+ any different Open Source business models. Yet the search continues for 
+ reliable revenue generating plans. This session will explore the variety
+  of approaches available to developers and will analyze both the advanta
+ ges and disadvantages of existing business models, while also exploring 
+ new models, such as revenue sharing, recommendations, third-party bundli
+ ng, advertising, and more.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090312T032839
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8207
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8207
+SUMMARY:Featherweight Linux: How to turn a netbook or older laptop into 
+ a Ferrari
+DESCRIPTION:Presented by Akkana Peck (*). This talk will cover ways of c
+ onfiguring a Linux distribution to run efficiently on slow CPU, low memo
+ ry machines. You can get big performance gains from areas such as:  * sp
+ eeding up the boot process  * options for lightweight window managers  *
+  performance tools that can help you find bottlenecks  * tuning your ker
+ nel  * Finding lightweight alternatives to big applications
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090310T214807
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7493
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--7493
+SUMMARY:Five Musical Patterns for Programmers
+DESCRIPTION:Presented by Jon Dahl (Tumblon). Music and software a lot in
+  common. We will look at five patterns from the world of music that are 
+ relevant to programming, and talk about how music history and theory can
+  help us become better software developers.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090310T223128
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8404
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8404
+SUMMARY:Open Source Analytics: Visualization and Predictive Modeling of 
+ Big Data with the R Programming Language
+DESCRIPTION:Presented by Michael Driscoll (Dataspora). The age of Big Da
+ ta demands open-source tools that move beyond storage towards analytics:
+   tools to turn terabytes into insights. R is an open-source language fo
+ r statistical computing and graphics, and an extensible, embeddable tool
+  for the analysis of large data sets. In this session, I showcase R's po
+ wer by building predictive models for Brazilian soybean harvests and bas
+ eball slugger salaries.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090310T225028
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8385
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8385
+SUMMARY:Bluffer's Guide to autoconf and automake
+DESCRIPTION:Presented by Casey West (Casey West Consulting). As users of
+  FLOSS software we have, on occasion, the need to understand the configu
+ ration systems of the software we use. This presentation will arm you wi
+ th just enough knowledge to be dangerous. You will learn how to write co
+ nfigure template files and, yes, you will learn about m4. m4 is the macr
+ o processor language used by autoconf.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090310T215203
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7842
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--7842
+SUMMARY:Preventing Data Loss Through Prudent Archiving
+DESCRIPTION:Presented by Bruce Momjian (EnterpriseDB). No one likes the 
+ sinking feeling of having lost data --- pictures, documents, source code
+ , or video that is gone and can never be fully recreated.  Though pruden
+ t archiving and risk analysis, it is possible to avoid data loss in all 
+ but the most extreme circumstances.  Data longevity is also an important
+  aspect of archiving, including the use of open data formats.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090311T033158
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8149
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8149
+SUMMARY:Put Down the Superglobals! Secure PHP Development with Inspekt
+DESCRIPTION:Presented by Edward Finkler (Funkatron Productions). Inspekt
+  is a filtering and validation library for PHP5.  With a focus on ease o
+ f use, Inspekt makes writing secure PHP applications faster and easier. 
+  This talk covers the Inspekt library and the "input cage" concept, best
+  practices when utilizing the library, and how to integrate Inspekt with
+  existing applications and popular frameworks.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090310T213744
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7988
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--7988
+SUMMARY:Practical Object-Oriented Models in SQL
+DESCRIPTION:Presented by Bill Karwin (Karwin Software Solutions). SQL is
+  from Mars, Objects are from Venus. This talk is for software developers
+  who know SQL but are stuck trying to implement common object-oriented s
+ tructures in an SQL database.  Mimicking polymorphism, extensibility, an
+ d hierarchical data in the relational database paradigm can be confusing
+  and awkward, but they don't have to be.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090714T021831
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8025
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8025
+SUMMARY:Getting It Out There: Distribute Your Software For Ubuntu With L
+ aunchpad
+DESCRIPTION:Presented by Josh Cronemeyer (ThoughtWorks). So you've just 
+ finished writing the next big thing, but how do you convince people to u
+ se it and build community around it? This talk will illustrate how to us
+ e Ubuntu's Launchpad to distribute open source applications. Launchpad i
+ s project hosting with unique features that facilitate simple installati
+ ons and upgrades leveraging the standard Debian distribution stack.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090706T154519
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8268
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8268
+SUMMARY:Snakebite: The Open Network
+DESCRIPTION:Presented by Trent Nelson (Snakebite), Titus Brown (Michigan
+  State University). Snakebite is a culmination of ten months of secretiv
+ e work, seven trips to Michigan State University, six blown fuses and ab
+ out $60,000.  The end result?  A network of around 37-ish servers of all
+  different shapes and sizes, specifically geared towards the development
+  needs of open source projects.  Get the inside scoop from Snakebite's F
+ ounder, Trent Nelson, and MSU Director Dr. Titus Brown.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090312T042450
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8011
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8011
+SUMMARY:Choosing a Web Architecture for Perl
+DESCRIPTION:Presented by Perrin Harkins (We Also Walk Dogs). In the past
+  few years, many new web proxy servers have come onto the scene with new
+  performance promises and features. At the same time, FastCGI has become
+  more widely used, giving people a possible alternative to mod_perl. Thi
+ s talk will help you choose the right architecture for you by presenting
+  a useful set of benchmarks and a comparison of strong points and key fe
+ atures.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T180500
+DTSTART;TZID=US/Pacific:20090722T172000
+DTSTAMP:20090310T213219
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8873
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-17:20--8873
+SUMMARY:Wikipedia for the iPhone/OLPC: storing the sum of human knowledg
+ e in 2GB
+DESCRIPTION:Presented by Patrick Collison (Live Current Media). Released
+  in early 2008 under the GPL, and downloaded over 100,000 times, the off
+ line Wikipedia reader for the iPhone was one of the most popular pre-SDK
+  apps. Now available in 17 languages for the iPhone/OLPC, it's the main 
+ means of browsing Wikipedia for those without internet access. This talk
+  explains the techniques and challenges involved in efficiently storing 
+ Wikipedia on a mobile device.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T190000
+DTSTART;TZID=US/Pacific:20090722T180000
+DTSTAMP:20090708T162028
+LOCATION:Exhibit Hall 2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9003
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-18:00--9003
+SUMMARY:Expo Hall Reception / OSCON Author Meet and Greet
+DESCRIPTION:Have a drink and mingle with other OSCON participants, and s
+ ee the latest products, projects, services, and gadgets from sponsors an
+ d exhibitors during the Expo Hall Reception. The OSCON Author Meet and G
+ reet will be held there as well at the same time.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090709T170447
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9380
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--9380
+SUMMARY:Open Source Language Roundtable
+DESCRIPTION:Join us for a live web-casted roundtable discussion with som
+ e of the leading figures in open source languages such as Ruby, Perl, Py
+ thon and PHP, hosted by O'Reilly Media.  We'll debate and discuss the st
+ rengths and weaknesses, and what the sweet spots are in the application 
+ space for each language.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090512T171501
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9091
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--9091
+SUMMARY:Open Source Network Monitoring & Management
+DESCRIPTION:As businesses, both small and large, try to cut operating co
+ sts, they begin to turn to open source software.  How do we lessen the e
+ ntry barrier to network monitoring with open source software, and what h
+ urdles do we still need to jump?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090716T201619
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10432
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--10432
+SUMMARY:StackOverflow Flash Mob for the R User Community
+DESCRIPTION:We will lead an online flashmob to populate StackOverflow wi
+ th R language content.  R, the open source statistical language, has a n
+ otoriously steep learning curve.  The same technical questions tend be a
+ sked repeatedly on the R-help mailing lists.  StackOverflow's forum repr
+ esents a powerful corrective to this ailment, and could prove a valuable
+  resource to the growing R community.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090602T100259
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9778
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--9778
+SUMMARY:OpenSolaris Source Juicer: Discussing Cloud-based Community Soft
+ ware Development
+DESCRIPTION:OpenSolaris Source Juicer is a web service for software cent
+ ric collaboration and development.  Much of the software development env
+ ironment can now be moved into the cloud.  I will discuss the capabiliti
+ es of this system as well as future possibilities for collaborative clou
+ d based software development.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090615T233651
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10184
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--10184
+SUMMARY:Writing (and More) for O'Reilly
+DESCRIPTION:Would you like to write for O'Reilly?  Blog?  Create podcast
+ s or screencasts?  Come find out what the possibilities include.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090602T172042
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9760
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--9760
+SUMMARY:Meet Authors from Pragmatic Bookshelf
+DESCRIPTION:Gather with published and upcoming authors of programming bo
+ oks from the industry favorite publisher, Pragmatic Bookshelf.  Join thi
+ s informal chat about programming, writing books, job hunting, and caree
+ r development.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090528T210752
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9775
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--9775
+SUMMARY:Gearman
+DESCRIPTION:Did you miss the Gearman tutorial or session? Have a questio
+ n that didn't get answered? Here's one more chance to discuss things!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090611T032239
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10161
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--10161
+SUMMARY:Taking Advantage of the Cloud
+DESCRIPTION:Join us to learn about Cloud Computing, how to get started, 
+ and how to take advantage of all of the available technology in cloud co
+ mputing today. This buzzword has a lot of interesting innovation behind 
+ it and you can take advantage of this innovation easily!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090617T172607
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10192
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--10192
+SUMMARY:BASH and Beyond...
+DESCRIPTION:Explore the concepts in automating tasks with BASH, PERL and
+  other scripting languages. What command line tools do you use to get th
+ e job done efficiently and effectively? With the growing prevalence of w
+ eb front-ends, how do you still use the command line to administer your 
+ systems?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090629T192310
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10222
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--10222
+SUMMARY:Best Practices for Social Websites in the Enterprise
+DESCRIPTION:Companies are increasing looking to use social publishing to
+  build audiences, get feedback about their products, make it easy for us
+ ers and fans to participate socially on their website, and help get conn
+ ected through integration with social networks.  In this session we will
+  review best practices in performance, scalability, security, and conten
+ t staging for these social publishing sites.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T200000
+DTSTART;TZID=US/Pacific:20090722T190000
+DTSTAMP:20090709T234248
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10352
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-19:00--10352
+SUMMARY:Joomla! Community Meet Up
+DESCRIPTION:What's happening in the Joomla! project? Meet Up to talk abo
+ ut 1.6, the Joomla! Framework, project organization, how to get involved
+  and future directions for Joomla! and its community.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T210000
+DTSTART;TZID=US/Pacific:20090722T200000
+DTSTAMP:20090714T163812
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10443
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-20:00--10443
+SUMMARY:Legal and Organizational Help for FOSS Non-Profits
+DESCRIPTION:FOSS projects regularly face legal issues.  Often these rela
+ te to licensing their own code, but as projects grow they also deal with
+  organizational issues, patent risk, and a variety of other challenges. 
+  In this BoF, FOSS legal and non-profit management professionals from th
+ e Software Freedom Law Center and Conservancy will talk about how to man
+ age these issues.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T210000
+DTSTART;TZID=US/Pacific:20090722T200000
+DTSTAMP:20090715T171153
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10444
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-20:00--10444
+SUMMARY:FamilySearch Genealogical Platform and You
+DESCRIPTION:FamilySearch is delivering Open Genealogical platform that i
+ ncludes: 1) APIs to billions of names and records 2) encouraging and con
+ tributing to open source projects for API wrappers and sample code for m
+ any environments. Free Developers Services at DevNet.FamilySearch.org. F
+ amilySearch is a nonprofit organization with the world's largest reposit
+ ory of genealogical resources.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T210000
+DTSTART;TZID=US/Pacific:20090722T200000
+DTSTAMP:20090716T180202
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10455
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-20:00--10455
+SUMMARY:Open Data and the Semantic Web
+DESCRIPTION:Are you interested in open data?  How about connecting your 
+ data to other data sets using Semantic Web technology?  We'll be sharing
+  ideas and answering questions on these topics and more.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090722T220000
+DTSTART;TZID=US/Pacific:20090722T210000
+DTSTAMP:20090716T183501
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10454
+UID:http://conferences.oreilly.com/oscon--s2009-07-22-21:00--10454
+SUMMARY:Is Enterprise Flash Ready for Prime Time?
+DESCRIPTION:Enterprise flash should mean higher performance and easier s
+ caling for web datacenters. However, questions remain about flash’s reli
+ ability, and exploiting its advantages will require new approaches to we
+ b application design. Peter Zaitsev will moderate this informative sessi
+ on where participants can discuss the opportunities and challenges for l
+ everaging flash.
+END:VEVENT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/OSCON20090723.ics	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,1534 @@
+BEGIN:VCALENDAR
+X-WR-CALNAME:OSCON 2009
+VERSION:2.0
+PRODID:Expectnation
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T091500
+DTSTART;TZID=US/Pacific:20090723T090000
+DTSTAMP:20090619T154409
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10173
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-09:00--10173
+SUMMARY:Standing Out in the Crowd
+DESCRIPTION:Presented by Kirrily Robert (Infotrope). What's it like to b
+ e a woman in an open source project that's 99% men? What's it like to be
+  a woman in a project that's 75%... women? Kirrily Robert, who has worke
+ d on both kinds of projects, will talk about the differences, and what w
+ e can learn from majority-female open source projects.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T090000
+DTSTAMP:20090625T233546
+LOCATION:Meeting Room C1/C4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9008
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-09:00--9008
+SUMMARY:OSCamp 2009
+DESCRIPTION:OSCamp 2009, a community organized event designed to share a
+ nd improve the essential skills required to participate in collaborative
+ , free and open online projects. The event features a mix of educational
+  presentations and hands-on coaching from experts in participatory commu
+ nities.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180000
+DTSTART;TZID=US/Pacific:20090723T090000
+DTSTAMP:20090702T000503
+LOCATION:Meeting Room N
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10250
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-09:00--10250
+SUMMARY:Sunlight Labs Hackathon
+DESCRIPTION:At the Sunlight Labs hackathon, Sunlight Labs will be workin
+ g with developers on two major projects: 1. Parsing sites at for our 50 
+ state project to get every state legislature in a common data format, an
+ d 2. Adding data into Sunlight's newest project, Congrelate.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T093000
+DTSTART;TZID=US/Pacific:20090723T091500
+ALTDTSTART;TZID=US/Pacific:20090723T090000
+DTSTAMP:20090715T172914
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9168
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-09:15--9168
+SUMMARY:Your Work in Open Source, the Numbers
+DESCRIPTION:Presented by Chris DiBona (Google, Inc.). Google crawls more
+  than just web  pages, we also crawl source code. Ever wondered just how
+  much open source code is out there? What licenses is all that code unde
+ r? Which projects are the most shared? We'll try to answer these questio
+ ns in this talk.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T094500
+DTSTART;TZID=US/Pacific:20090723T093000
+ALTDTSTART;TZID=US/Pacific:20090723T090000
+DTSTAMP:20090624T145340
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10209
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-09:30--10209
+SUMMARY:Enabling Academic Research – Open Tools and Services on Microsof
+ t Platforms
+DESCRIPTION:Presented by Tony Hey (Microsoft Corporation). Microsoft Ext
+ ernal Research builds bridges between academia, industry, and government
+  to advance computer science, education, and scientific research. Modern
+  science and academic research increasingly relies on integrated informa
+ tion technologies and computation to collect, process, and analyze compl
+ ex data.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T100000
+DTSTART;TZID=US/Pacific:20090723T094500
+ALTDTSTART;TZID=US/Pacific:20090723T090000
+DTSTAMP:20090427T153754
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9210
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-09:45--9210
+SUMMARY:Cloud Computing - Why IT Matters
+DESCRIPTION:Presented by Simon Wardley (Canonical Ltd). Keynote by Simon
+  Wardley, Canoncial Ltd.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T101500
+DTSTART;TZID=US/Pacific:20090723T100000
+ALTDTSTART;TZID=US/Pacific:20090723T090000
+DTSTAMP:20090325T171030
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9016
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:00--9016
+SUMMARY:Q & A
+DESCRIPTION:An open microphone question and answer session with the morn
+ ing's keynote speakers.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090310T214001
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8196
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8196
+SUMMARY:Drizzle: Status, Principles, and Ecosystem
+DESCRIPTION:Presented by Brian Aker (Sun Microsystems, Inc.), Monty Tayl
+ or (Sun Microsystems - Drizzle), Mark Atwood (Network.com at Sun Microsy
+ stems), Ronald  Bradford (42SQL), Eric Day (Sun Microsystems), Patrick G
+ albraith (Lycos Inc.). In this panel talk a number of core Drizzle devel
+ opers will explain where development sits today, critical tools involved
+ , best practices that were used to get here, and how a vibrant open-sour
+ ce developer community has been built.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090713T211653
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8008
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8008
+SUMMARY:<video> and the Open Web
+DESCRIPTION:Presented by Mark Surman (Mozilla Foundation), Asa Dotzler (
+ Mozilla). Using the <video> tag in HTML5, developers can do all sorts of
+  things that are hard or impossible with plugins. In this presentation, 
+ Mozilla's Mark Surman and Asa Dotzler paint a picture of the open video 
+ future and demo the cool stuff you can do with web video when it's prope
+ rly integrated with a page.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090310T213033
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8133
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8133
+SUMMARY:Persistence Solutions with the Smalltalk Seaside Web Framework
+DESCRIPTION:Presented by Randal L. Schwartz (Stonehenge Consulting Servi
+ ces, Inc.). Nearly all Web Applications need persistent solutions to be 
+ effective. For Perl and Ruby, the choice is generally "use an Object-Rel
+ ational Mapper to put data into an SQL database", but with Smalltalk's o
+ bject model, pure-object storage is also available as an option.  We'll 
+ look at ORM and Object solutions for web apps built with Seaside, includ
+ ing a few commercial solutions like GemStone/S
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090629T215044
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8105
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8105
+SUMMARY:Computational Journalism
+DESCRIPTION:Presented by Nick Diakopoulos (Georgia Tech), Brad Stenger (
+ Ars Technica). The era of traditional journalism is giving way to someth
+ ing else. We think that something else is Computational Journalism. CJ r
+ ecognizes the need for internal production and for public-facing news de
+ livery innovations. What journalists provide in terms of services, inter
+ faces, and business models are in flux. To settle things, smart experime
+ nts (often using Open Source APIs) are critical.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090312T152958
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8135
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8135
+SUMMARY:Situation Normal, Everything Must Change
+DESCRIPTION:Presented by Simon Wardley (Canonical Ltd). In today's compu
+ ting world, it can often feel like we are drowning in wave after wave of
+  new trends such as mashups, service oriented architecture and cloud com
+ puting. This sea of concepts are simply the manifestation of an underlyi
+ ng change in IT. In this session we will explore what is happening and w
+ hy open source is the dominant model for the future.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090310T220333
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8194
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8194
+SUMMARY:Introduction to Forensics
+DESCRIPTION:Presented by Kyle Rankin (QuinStreet, Inc.). n this talk Kyl
+ e Rankin will provide an introduction to performing forensics analysis o
+ n Linux machines using the popular Sleuthkit tools with their easy-to-us
+ e Autopsy web-based front-end. The talk will cover basic concepts for a 
+ forensics investigation, and at the end there will be a demo with a comp
+ romised Linux image.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090310T213251
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7920
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--7920
+SUMMARY:There Are No Unicorns: And Other Lessons Learned While Running a
+ n Innovation Team
+DESCRIPTION:Presented by Rolf Skyberg (eBay, Inc.). Everybody wants inno
+ vation. Innovation is believed to be magical unicorn which will lead the
+  way to success and riches, but this is easier said than done. In this t
+ alk I'll discuss lessons learned from two years driving innovation on eB
+ ay's Disruptive Innovation team; which strategies worked and which didn'
+ t, and what questions you should start asking first when someone tells y
+ ou to "go innovate"!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090310T213245
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8416
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8416
+SUMMARY:What Has Worked: OpenOffice.org Around the World
+DESCRIPTION:Presented by Louis Suarez-Potts (Sun Microsystems, Inc. / Op
+ enOffice.org). OOo has succeeded in engaging thousands of contributors a
+ round the world. Many are not technical. How was this done? As well, gov
+ ernments are now adopting OpenOffice.org: Why? And, how do the local and
+  localization communuties contribute to this adoption? Finally, what les
+ sons can other Foss projects take from OpenOffice.org's accompishments?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090714T180056
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8792
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8792
+SUMMARY:Wrangling Your Ubuntu Systems
+DESCRIPTION:Presented by Ken Drachnik (Canonical). As Ubuntu environment
+ s grow, the complexity of managing packages and updating systems quickly
+  outgrows the ability of a sys admin to easily manage servers and deskto
+ ps with manual commands and scripts.    This talk will explore some of t
+ he technologies that Ubuntu admins can use to manage their Ubuntu enviro
+ nments and how these can be extended to managing Cloud environments.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090504T175843
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8999
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8999
+SUMMARY:Building Enterprise Social Networks with Liferay Portal
+DESCRIPTION:Presented by Brian Chan (Liferay, Inc.). Liferay Portal is a
+  Java framework that provides blogs, document management, message boards
+ , and wikis, with a social network flavor. We'll demo how to use Liferay
+  Social API to wire collaborative social network sites for Cisco and Min
+ i United, write an app that will automatically expose it to Facebook and
+  iGoogle, and how to write language-agnostic apps in Java, Groovy, PHP, 
+ Python, and Ruby.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090716T202709
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9914
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--9914
+SUMMARY:Building Complex UI Animations in Moblin Clutter 1.0
+DESCRIPTION:Presented by Chris Lord (Intel). In the process of creating 
+ application for the new user experience in Moblin 2.0, a lot has been le
+ arned about how to effectively use Clutter to build aesthetically pleasi
+ ng and practical interfaces. This will be a tutorial on how to implement
+  complex and good-looking UI animations using Clutter.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090615T205745
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10185
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--10185
+SUMMARY:Give Your ERP Some REST with p2ee
+DESCRIPTION:Presented by Alejandro Imass (Yabarana Corporation). ERP is 
+ an area where FOSS programmers haven't particularly excelled at challeng
+ ing the dogmas of traditional IS. In fact, the “monolithic ERP†challeng
+ es the very nature of FOSS and the diversity of it's communities. p2ee i
+ s a back-to-basics approach, based on the REST architectural style and n
+ ew Web2 technologies.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090714T153106
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9119
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--9119
+SUMMARY:JRuby on Google App Engine
+DESCRIPTION:Presented by John Woodell (Google, Inc. ), Max Ross (Google,
+  Inc. ), Ted Han (Videojuicer). Using JRuby, apps created with Ruby fram
+ eworks like Rails or Merb can now be deployed to Google's highly scalabl
+ e infrastructure. This talk, will provide an overview of App Engine, wit
+ h attention to current features and apis. We will also show some demos, 
+ including deployment to the production environment, and provide some ins
+ ight into (and best practices for) using the App Engine Datastore.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090310T233842
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8169
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--8169
+SUMMARY:All the Little Pieces: Distributed systems with PHP
+DESCRIPTION:Presented by Andrei Zmievski (Digg). Scaling up takes you on
+ ly so far. Every Web business serious about its future needs to think ab
+ out scaling out. Distributed systems are a key component of this strateg
+ y, but they aren't as difficult as they sound. This session will cover s
+ everal distributed technologies and their use with PHP.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T113000
+DTSTART;TZID=US/Pacific:20090723T104500
+DTSTAMP:20090311T021751
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7373
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-10:45--7373
+SUMMARY:Java Testing on the Fast Lane
+DESCRIPTION:Presented by Andres Almiray (Oracle USA Inc.), Ixchel Ruiz (
+ CCA). Learn how the Groovy language can help you enhance your testing ex
+ perience of Java applications.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090310T214816
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8415
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8415
+SUMMARY:Functional Programming for the Real World
+DESCRIPTION:Presented by Bryan O'Sullivan (Serpentine Green Design). Lan
+ guages like Erlang, Haskell, Scala and Clojure have been gaining visibil
+ ity rapidly over the past few years. Our panel will discuss the advantag
+ es and challenges of developing and deploying software using functional 
+ languages. How do coding, QA, and maintenance change in this world?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090325T211619
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8584
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8584
+SUMMARY:Building Compilers with the Parrot Compiler Toolkit
+DESCRIPTION:Presented by Patrick Michaud (pmichaud.com). This talk provi
+ des a tutorial on creating compilers in Parrot using the Parrot Compiler
+  Toolkit.  It walks through the process of creating a parser, building a
+ n abstract syntax tree, and generating executable output.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090314T035856
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7859
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--7859
+SUMMARY:Tips and Tricks for Writing PostGIS Spatial Queries
+DESCRIPTION:Presented by Leo Hsu (Paragon Corporation), Regina Obe (Para
+ gon Corporation). We shall present 10 tricks/techniques for writing effi
+ cient PostGIS spatial queries.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090602T160439
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8354
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8354
+SUMMARY:The Google Open Source Update
+DESCRIPTION:Presented by Chris DiBona (Google, Inc.). In this talk, Chri
+ s DiBona will bring the audience up to date on recent Google activities 
+ in open source. We will specifically cover advances in Android's open so
+ urce deployment infrastructure, including the Gerrit and Repo tools, and
+  the directions those tools are taking.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090310T220701
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7984
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--7984
+SUMMARY:Eucalyptus: an Open Source Infrastructure for Cloud Computing
+DESCRIPTION:Presented by Rich Wolski (University of California, Santa Ba
+ rbara (UCSB)). We will present Eucalyptus -- Elastic Utility Computing A
+ rchitecture for Linking Your Programs to Useful Systems -- an open sourc
+ e software infrastructure that implements IaaS-style cloud computing. Th
+ e goal of Eucalyptus is to allow sites with existing clusters and server
+  infrastructure to host an elastic computing service that is interface-c
+ ompatible with Amazon's AWS.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090310T214915
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8397
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8397
+SUMMARY:Security-Centered Design: Exploring the Impact of Human Behavior
+DESCRIPTION:Presented by Chris Shiflett (OmniTI). Perception is as impor
+ tant as reality. In this multifarious talk, I'll introduce some of what 
+ I have learned about cognitive psychology, exploring topics such as chan
+ ge blindness and ambient signifiers, and I'll show some real-world examp
+ les that demonstrate the profound impact human behavior can have on secu
+ rity.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090311T010407
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8218
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8218
+SUMMARY:Building a Business on the Cheap
+DESCRIPTION:Presented by Chris Wanstrath (GitHub). With all the hype sur
+ rounding multimillion dollar rounds of funding, it's easy forget there's
+  another way to build a business: by being cheap and smart. By relying o
+ n open source, building in increments, and only buying what you need, it
+ 's possible to create a successful company on your own (or with a few co
+ -founders). This talk will focus on just that: the frugal path to profit
+ ability.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090310T225036
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8381
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8381
+SUMMARY:Make Great Spreadsheets
+DESCRIPTION:Presented by Casey West (Casey West Consulting). "Spreadshee
+ t::WriteExcel":http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel-
+ 2.25/ is a great Perl module for generating useful Spreadsheets with mul
+ tiple worksheets, cell formatting, and data validation. You can use thes
+ e spreadsheets for simple reporting, of course, or you can use them as a
+ n alternate interface to a data heavy application.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090404T003942
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8298
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8298
+SUMMARY:Launchpad Foundations: Learning to Leverage a Component Architec
+ ture
+DESCRIPTION:Presented by Gary Poster (Canonical, Ltd.). Study gains and 
+ losses in how Launchpad, a collaboration web service for the open-source
+  community, used a Python component library from Zope 3 to help manage a
+  large project. Discuss when the approach might be appropriate. Code exa
+ mples include automatic REST web service generation.  Demonstrate how th
+ e component architecture might be leveraged in popular frameworks such a
+ s Django.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090706T231047
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10357
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--10357
+SUMMARY:Controlling the Addiction: Best Practices for Scaling With Memca
+ ched (a.k.a "Crack for Developers") & the LAMP Stack
+DESCRIPTION:Presented by Joaquin Ruiz (Gear6). Dynamic consumer content 
+ on the Web is straining the LAMP stack and demands a new caching tier fo
+ r maximum scale.  Take a hit of Memcached and the sky's the scalability 
+ limit, but be careful not to overdose.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090311T132123
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8417
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8417
+SUMMARY:Accelerate your Rails Site with Automatic Generation-based Actio
+ n Caching
+DESCRIPTION:Presented by Rod Cope (OpenLogic, inc.). Rails caching is di
+ fficult and complicated.  It takes some work to set it up, but it's even
+  harder to make sure you always clear the right cache when data gets cha
+ nged.  This session demonstrates how to build an automatic generation-ba
+ sed action caching mechanism built on memcached that can handle edits fr
+ om any angle while guaranteeing that users never see stale data.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090310T213904
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7529
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--7529
+SUMMARY:Untestable Code
+DESCRIPTION:Presented by Sebastian Bergmann (thePHP.cc). How do you writ
+ e untestable code and anger an ancient goddess? These and other question
+ s will guide us while we discuss testability, an often forgotten attribu
+ te of software design and quality. Starting from untestable code fragmen
+ ts, the audience will learn why the code is untestable and how it can be
+  refactored for testability.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T122000
+DTSTART;TZID=US/Pacific:20090723T113500
+DTSTAMP:20090318T211034
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8348
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-11:35--8348
+SUMMARY:Spring Framework 3.0- New and Notable
+DESCRIPTION:Presented by Rod Johnson (SpringSource). The Spring Framewor
+ k is the most popular application programming framework for Java/Java EE
+  development, with widespread adoption across many industries. If you’re
+  a Spring user, you should understand the Spring 3.0 features and how th
+ ey may benefit you; if you are not yet a Spring user, you may find Sprin
+ g significantly more compelling.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090324T032001
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8106
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8106
+SUMMARY:State of Lightning Talks 2009
+DESCRIPTION:Presented by Josh Berkus (PostgreSQL Experts, Inc.). Come se
+ e your favorite open source projects for updates on what they've been do
+ ing while you were out partying (or job-hunting) all year.  What has Moz
+ illa been up to?  What's going on with the FreeBSD Kernel?  Have MySQL a
+ nd PostgreSQL finally killed each other off? Join us for a 1 1/2 hour se
+ ssion of 5-minute project updates, combined with both intentional and un
+ intentional humor.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090716T182601
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7999
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--7999
+SUMMARY: Thunderbird 3: A user-centric platform for email, learning from
+  the web
+DESCRIPTION:Presented by David Ascher (Mozilla Messaging), Dan Mosedale 
+ (Mozilla). Thunderbird 3 is nearing release -- in this developer-oriente
+ d talk, David Ascher and Dan Mosedale will talk about what Thunderbird 3
+  will mean to people who want to take an active role in managing their e
+ mail lives.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090310T213506
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7905
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--7905
+SUMMARY:Taming Your Data: Practical Data Integration Solutions with Kett
+ le
+DESCRIPTION:Presented by Roland Bouman (XCDSQL Solutions / Strukton Rail
+ ). Nowadays, data is everywhere: databases, spreadsheets, the web...if o
+ nly we could access it at on time, at the right place, in the right form
+ ... Turning data into information is a struggle. Like diamonds are mined
+  and cut to create jewels, so must data be extracted and transformed to 
+ create information. Learn how the open source data integration tool Kett
+ le helps to fight your data dragons.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090310T213248
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8409
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8409
+SUMMARY:Email Hates the Living!
+DESCRIPTION:Presented by Ricardo Signes (Pobox.com). Email: you see it e
+ very day. It's on your desktop. It's in your servers. Through the magic 
+ of modern technology, it flows invisibly through the air and into your P
+ DA! Your cellular phone conducts silent and arcane conversations  with d
+ istant servers, speaking the ancient language of SMTP and the unknowable
+  dialects of IMAP. Surely all this technology means progress of mankind.
+ .. or does it?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090312T072823
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7927
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--7927
+SUMMARY:Building Custom Linux Images for Amazon EC2
+DESCRIPTION:Presented by Eric Hammond (Campus Explorer, Inc.). Learn how
+  to create your own Linux machine images (AMIs) for running on Amazon EC
+ 2 (Elastic Compute Cloud) customized with your choice of software packag
+ es and application software configured to your liking. Use the latest op
+ en source software to build custom images from scratch in a secure, auto
+ mated, reproducible process. Discover when to use a public image with au
+ tomatic customization at boot.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090619T154230
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10204
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--10204
+SUMMARY:Why It Is Hard To Be Fast
+DESCRIPTION:Presented by Dirk Hohndel (Intel Corporation), Arjan van de 
+ Ven (Intel). From the early 80s to the early 2000s computers and softwar
+ e got faster. But in the last 5 years the perception of performance hasn
+ 't really changed - or has even gotten worse! In this presentation we'll
+  explain why it is hard to be fast, walk the audience step by step throu
+ gh one example where we addressed the issue and talk about ways to look 
+ at the problem more systematically.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090311T110242
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8083
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8083
+SUMMARY:Does Working with Free Software Have to be so Hard?
+DESCRIPTION:Presented by Dave Neary (Neary Consulting). Most companies w
+ ho start working with free software projects have trouble. They run over
+  common stumbling blocks. Questions go unanswered, patches go unreviewed
+ . Why does it take so much time and evergy to be a good citizen? This pr
+ esentation will outline the problems, and will give some metrics which y
+ ou can use to evaluate a community's health before marrying them.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090407T194535
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7564
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--7564
+SUMMARY:Erlang for Five Nines: A non technical introduction to Erlang
+DESCRIPTION:Presented by Francesco Cesarini (Erlang Training and Consult
+ ing Ltd). This talk will introduce Erlang, expanding on what the hype is
+  all about. It will provide a high level technical overview, looking at 
+ its concurrency model and distribution models, software upgrade during r
+ untime and scalability on multicore. It will describe its ever expanding
+  community and domains of use, with examples on open source applications
+ , commercial products and research projects
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090313T012221
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8166
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8166
+SUMMARY:FreeTUIT - Codeless GUI Programming
+DESCRIPTION:Presented by Eric Wilhelm (Scratch Computing). FreeTUIT is d
+ esktop programming with less code.  A concise, declarative syntax for wi
+ dget layout and an expressive API for runtime give you clean and maintai
+ nable wxWidgets or Qt cross-platform applications in minutes.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090406T140712
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8411
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8411
+SUMMARY:Building a Corporate Blog Portal Using WordPress MU
+DESCRIPTION:Presented by Dan York (Voxeo Corporation). In this tight eco
+ nomy, are you looking for a way to create a multi-blog portal for your c
+ ompany or organization without spending a zillion dollars?  This talk wi
+ ll introduce how you can create a powerful, custom-branded blog portal s
+ upporting blogs and podcasts using the open source WordPress MU.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090714T205725
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10436
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--10436
+SUMMARY:The Secured Enterprise: Leverage OpenID with Web Services
+DESCRIPTION:Presented by Prabath Siriwardena (WSO2 Inc.). SOA security n
+ eeds to be by design, not as an afterthought. This session will demonstr
+ ate implementing Message Interceptor Gateway security pattern with WSO2 
+ ESB, WSO2 WSAS and WSO2 Identity Server - together with the OpenID/Infor
+ mation Cards integration pattern at the front end.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090310T220812
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8480
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8480
+SUMMARY:Rubinius 1.0: The Ruby VM That Could
+DESCRIPTION:Presented by Brian Ford (Engine Yard). This talk will give a
+ n overview of Rubinius, an alternative Ruby implementation with a C++ VM
+ , Ruby standard library, and Ruby compiler. It will also detail major re
+ cent changes like switching away from stackless execution and improvemen
+ ts in the core library data structures, garbage collector, compiler, and
+  JIT assembler.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090323T204710
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8363
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8363
+SUMMARY:Scaling Firefox Support with PHP
+DESCRIPTION:Presented by Laura Thomson (Mozilla Corporation). On Downloa
+ d Day 2008 eight million users downloaded Firefox 3 and set a Guinness W
+ orld Record.  Firefox 3's in-product help is provided by support.mozilla
+ .com, written in PHP and using a variety of FOSS tools.  Learn how we sc
+ aled up for Download Day and how we support millions of users worldwide.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T143000
+DTSTART;TZID=US/Pacific:20090723T134500
+DTSTAMP:20090317T235758
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8144
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-13:45--8144
+SUMMARY:A Survey of Concurrency Constructs
+DESCRIPTION:Presented by Ted Leung (Sun Microsystems). This talk will be
+  a survey of concurrent programming constructs which are currently avail
+ able in some programming language or library.    We will look at program
+ ming model being presented, as well as examining some of the implementat
+ ion challenges for the various models.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090312T074111
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8264
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--8264
+SUMMARY:Prism, Bringing Web Applications to the Desktop
+DESCRIPTION:Presented by Matthew Gertner (Independent). Although web app
+ lications are catching up with their desktop counterparts, there is stil
+ l ground to cover. Prism, a project initiated by Mozilla Labs, is an att
+ empt to bridge this gap. In this talk, we explain why Prism represents a
+  superior web client for running web applications. We use a live demo to
+  show how easy it is to use Prism to customize a popular web app.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090311T095939
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8364
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--8364
+SUMMARY:Neo4j - The Benefits of Graph Databases
+DESCRIPTION:Presented by Emil Eifrem (Neo Technology). A graph db stores
+  data in a network structure rather than in relational tables. This mode
+ l is well suited for many web use cases such as tagging, metadata annota
+ tions, social networks, wikis and other network-shaped or hierarchical d
+ ata sets. This talk will introduce Neo4j: a high-performance, transactio
+ nal open source graph db, which frequently outperforms RDBMSs with >1000
+ x for such use cases.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090310T223205
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7925
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--7925
+SUMMARY:How To Lie Like A Geek
+DESCRIPTION:Presented by Michael Schwern (Open Sourcery). Geeks have a s
+ pecial relationship with The Truth.  Nothing is more important than corr
+ ecting a falsehood, no matter how small, and nothing is more odious than
+  not telling The Truth.  Unfortunately the meaning is often mangled and 
+ the end result is the opposite, a lie.  This leads to misunderstanding, 
+ mangled interfaces and the myth of the stupid user.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090716T023654
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8362
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--8362
+SUMMARY:Building a Highly Scalable, Open Source, Twitter Clone
+DESCRIPTION:Presented by Dan Diephouse (MuleSource), Paul Brown (Multifa
+ rious, Inc). What would you do if you were tasked with building a Twitte
+ r clone which was highly scalable, made from open source components and 
+ deployed in this infamous thing we call the cloud?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090714T213122
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10435
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--10435
+SUMMARY:MariaDB: Community Driven SQL Server
+DESCRIPTION:Presented by Kurt von Finck (Monty Program Ab), Michael Wide
+ nius (Monty Program Ab). MariaDB is a fork of Sun's MySQL product. This 
+ talk will present how MariaDB is both similar to and different from MySQ
+ L, in both social and technical senses.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090311T190108
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7453
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--7453
+SUMMARY:Apache's "Open for Business" - Holistic Analysis and Design
+DESCRIPTION:Presented by David E Jones (Apache Software Foundation). Ope
+ n source software opens a new world of efficiency and flexibility for so
+ ftware, leading to new levels of custom built and customized software. T
+ he approach described combines common pre-implementation artifacts used 
+ in specific ways to lead from requirements to designs and then to softwa
+ re that does a good job of meeting the needs of individuals and organiza
+ tions.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090316T203734
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8377
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--8377
+SUMMARY:The Role of Users in Open Source Projects
+DESCRIPTION:Presented by Stormy Peters (GNOME Foundation). While consume
+ rs and the open source community don't interact often, users are importa
+ nt to projects because users test software, spread the word, motivate de
+ velopers, lend credibility, contribute financially and participate in us
+ ers groups. Come learn why users are important to an open source project
+  and how they can be more involved.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090310T230538
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8230
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--8230
+SUMMARY:High Performance SQL with PostgreSQL
+DESCRIPTION:Presented by David Fetter (PgExperts). PostgreSQL 8.4 is the
+  first Open Source database management system to handle trees and lists 
+ using SQL:2008-compliant Common Table Expressions and Windowing function
+ s.  You'll learn how these work, see intriguing examples, and walk out r
+ eady to use them to your advantage.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090504T112015
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8460
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--8460
+SUMMARY:Improving Legal Certainty in FOSS: Best Practices for Upstream P
+ rojects
+DESCRIPTION:Presented by Richard Fontana (Red Hat, Inc.). FOSS can be se
+ en as a new kind of legal system that facilitates sharing rights in code
+ . Viewed in this way, FOSS can benefit from greater public knowledge of 
+ code origins and licensing rules. My talk will focus on practical guidan
+ ce for projects seeking to improve legal certainty in the code they writ
+ e and use. I  will conclude with some longer-term institutional proposal
+ s.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090609T174834
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10154
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--10154
+SUMMARY:Solving The Troll Problem: The Role of Allied Security Trust and
+  Open Invention Network
+DESCRIPTION:Presented by Keith Bergelt (Open Invention Network), Daniel 
+ McCurdy (Allied Security Trust). Over the last decade, patent litigation
+ s launched by “patent trolls†have increased from approximately 3% of al
+ l patent litigations filed to over 17%.  This session will analyze this 
+ issue and offer detailed recommendations to reduce exposures to “patent 
+ trolls,†including the role of AST and OIN in reducing such threats.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090701T203154
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10340
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--10340
+SUMMARY:How to Become a RESTafarian WOArrior
+DESCRIPTION:Presented by Aaron Fulkerson (MindTouch, Inc. ). The web has
+  evolved into the preeminent application platform. The design principles
+  and technologies that have served the Internet well in terms of cost, s
+ cale and ease of development are just beginning to be applied to the ent
+ erprise. This session explains the characteristics and benefits of Web O
+ riented Architecture (WOA), provides strategies and includes enterprise 
+ success stories.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090630T174954
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7965
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--7965
+SUMMARY:IronRuby 0.9
+DESCRIPTION:Presented by Jimmy Schementi (Microsoft). IronRuby is almost
+  at 1.0! Come and see how IronRuby is used in .NET programs, how well it
+  performs, and how conformant it is.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090317T190258
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8386
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--8386
+SUMMARY:2009 PHP Best Practices
+DESCRIPTION:Presented by Luke Welling (OmniTI), Laura Thomson (Mozilla C
+ orporation). Web applications are like trees.  Slice through them and yo
+ u can judge their age by looking at the growth rings. You've probably ab
+ andoned PHP4 compatibility by now, but are you taking advantage of pract
+ ices that have made web application development a mature discipline? Com
+ e with us on a tour of PHP best practices in 2009.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T152000
+DTSTART;TZID=US/Pacific:20090723T143500
+DTSTAMP:20090310T220346
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7917
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-14:35--7917
+SUMMARY:Clojure: Functional Concurrency for the JVM
+DESCRIPTION:Presented by Howard Lewis Ship (Formos). Clojure is a functi
+ onal programming language that runs on the JVM and features great perfor
+ mance and innovative concurrency support.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090311T033638
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7934
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--7934
+SUMMARY:Perl Lightning Talks
+DESCRIPTION:Presented by R Geoffrey Avery (Marchex Voice Services). A se
+ ries of 5-minute talks on anything related to Perl or people who use it.
+  A chance to get one-third of your 15 minutes of fame.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090323T205157
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8107
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--8107
+SUMMARY:Mashing-up Music with Songbird
+DESCRIPTION:Presented by Steven Bengston (Pioneers of the Inevitable). K
+ now Javascript, HTML, and CSS?  Interested in music, and exploring what'
+ s possible when you combine the power of Mozilla, add-ons, and music on 
+ the web?  Songbird, a desktop media player powered by Mozilla's XULRunne
+ r/Firefox platform, allows you to build Javascript extensions to create 
+ new digital media mashups using open APIs, and media web services.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090310T221754
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7975
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--7975
+SUMMARY:Cassandra: Open Source Bigtable + Dynamo
+DESCRIPTION:Presented by Jonathan Ellis (Rackspace Hosting). Cassandra i
+ s a third-generation open source distributed database that marries Bigta
+ ble's rich data model with Dynamo's aggressive simplicity to produce a u
+ niquely compelling alternative to traditional relational databases.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090622T213820
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8300
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--8300
+SUMMARY:Beyond the Hype: The True Costs of Open Source
+DESCRIPTION:Presented by Matt Asay (Alfresco), Zack Urlocker (MySQL), Ma
+ tt Deuel (Virgin Mobile), Jeffrey Hammond (Forrester Research), Barry  K
+ lawans (San Francisco International Airport, IT&T Department). In a time
+  of tight IT budgets, open source has attracted much attention due to it
+ s cost advantages.  But what is hype and what is reality? Join industry 
+ veterans, analysts and end-users as the look at the true costs and cost 
+ savings of open source.  Participants will discuss how smart open source
+  implementation can save money and where investments need to be made.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090716T175345
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7910
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--7910
+SUMMARY:Portability in the Cloud: An Open Standard for Using Cloud Resou
+ rces
+DESCRIPTION:Presented by Alex Polvi (Cloudkick). This talk will discuss 
+ the on going effort to standardize the interfaces into the cloud. Curren
+ tly every cloud provider has a unique, proprietary, API for consuming th
+ e services they offer. The Cloud Computing Interoperability movement aim
+ s to provide standards that will overcome vendor lock-in, benefit the co
+ nsumers, and allow the cloud ecosystem to grow transparently.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090325T210033
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8559
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--8559
+SUMMARY:Implementing Privacy: OAuth & Token Madness
+DESCRIPTION:Presented by Evan 'Rabble' Henshaw-Plath (entp.com). Ever cr
+ inge when you're asked to enter your email address and password to a thi
+ rd party service? This talk will cover how to build and consume services
+  which protect users privacy with OAuth and other techniques.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090310T213239
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8256
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--8256
+SUMMARY:Easy as BIRT: Introduction to Reporting
+DESCRIPTION:Presented by Jason Weathersby (Actuate Corporation). This se
+ ssion will detail using BIRT to create interactive content for your intr
+ anet and external web based applications.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090311T004447
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8212
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--8212
+SUMMARY:Just Get the Job Done! Serving the Community One Argument at a T
+ ime.
+DESCRIPTION:Presented by Jacinta Richardson (Perl Training Australia). T
+ he president of your committee is doing most of the work and none of the
+  management.  The secretary hasn't written the minutes for any of the me
+ etings for the last 6 months (you wrote the last 4 agendas).  The treasu
+ rer can't access the bank account, and you haven't heard from your publi
+ city officer since you started planning the big event.  Welcome to the f
+ un of volunteer communities!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090310T215811
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7438
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--7438
+SUMMARY:Open Source Documentation Doesn't Have to Suck
+DESCRIPTION:Presented by Addison Berry (Lullabot). Many people view Open
+  Source documentation as something they have to suffer if they want to u
+ se a free product. As Open Source code spreads faster and further in the
+  great, wide world, we need to up the ante on documentation as well to k
+ eep fanning the flames. We'll take a look at how one community, the Drup
+ al project, is trying to raise the bar and how others can learn from the
+ ir ups and downs.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090415T180534
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7915
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--7915
+SUMMARY:XTraDB OpenSource Storage Engine for MySQL
+DESCRIPTION:Presented by Vadim Tkachenko (Percona Inc), Ryan Lowe (Perco
+ na). A storage engine for MySQL based on the InnoDB storage engine, desi
+ gned to better scale on modern hardware, and including a variety of othe
+ r features useful in high performance environments. It is fully backward
+ s compatible, and so can be used as a drop-in replacement for standard I
+ nnoDB.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090508T154947
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8049
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--8049
+SUMMARY:Unit Test Your Database!
+DESCRIPTION:Presented by David Wheeler (Kineticode, Inc.). You unit test
+  your application API. You unit test your presentation layer. You write 
+ integration and acceptance tests. But your database is tested only as a 
+ side-effect to testing everything else. That's a pretty important part o
+ f the stack to just leave to the assumption it works as expected! Come t
+ o this talk to learn about the tools that enable integrated unit tests f
+ or your database.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090319T000405
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8126
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--8126
+SUMMARY:Website Releases Made Easy with the PEAR Installer
+DESCRIPTION:Presented by Helgi Thomar Thorbjoernsson (echolibre). Ever w
+ ondered if there is a easier way to manage releases for your website ? Y
+ ou will learn how to harness the power of the PEAR installer to make the
+  release process as lean, mean and slick as possible so even your intern
+ s will be able to handle it.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T171500
+DTSTART;TZID=US/Pacific:20090723T163000
+DTSTAMP:20090311T024947
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7505
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-16:30--7505
+SUMMARY:NASA World Wind: A New Mission
+DESCRIPTION:Presented by Patrick Hogan (NASA), Randy Kim (NASA). We are 
+ entering an era when 3D visualization technology will become as standard
+  as 2D web browsers are today. NASA World Wind is standards-based, open 
+ source technology oriented to stimulate innovation. Just as public highw
+ ays built for the common good opened up huge opportunities for society, 
+ so too NASA World Wind client *and* server technology provides a public 
+ domain 3D highway.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090310T223443
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8332
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8332
+SUMMARY:Use LINA to Reach Your Users on all Platforms
+DESCRIPTION:Presented by Saill White (Lina Software), Paul  Honis (Lina 
+ Software). In this session, we will help you create a single universal b
+ inary and installer of your Open Source project that can run on Windows,
+  Mac, UNIX, Xen, VMware, VirtualBox, Qemu, Parallels, and Amazon's EC2. 
+ If you want to Linafy your app, just create a Debian package of your app
+ lication and bring that and a 128x128 PNG image of your logo.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090318T002422
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7948
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--7948
+SUMMARY:MySQL Community Patches & Extensions
+DESCRIPTION:Presented by Peter Zaitsev (MySQL Performance Blog). Besides
+  MySQL release officially available from Sun there are multiple patches 
+ and extensions developed by community.  In this Presentation we will loo
+ k into them to see what extra features patches from Google, Percona and 
+ OurDelta offer and how can you use them to make your MySQL life more fun
+ .
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090529T184807
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7471
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--7471
+SUMMARY:What Web App Design Can Learn From the Harpsichord
+DESCRIPTION:Presented by Elaine  Wherry (Meebo). Baroque harpsichordists
+  excelled at taking simple melodies and creating elaborate, beautiful pi
+ eces of music. But in their desire to push the boundaries of experimenta
+ tion, these keyboard virtuosi eventually ornamented the music beyond the
+  limits of good taste, making the composer’s original melody unrecogniza
+ ble. Something similar happens in web design.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090310T221244
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8825
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8825
+SUMMARY:Building Applications Across the Enterprise and Cloud Using Mule
+DESCRIPTION:Presented by Ken Yagen (MuleSource). This session details ho
+ w developers can use Mule -- an open source enterprise service bus (ESB)
+  -- to develop, deploy and integrate composite applications on both side
+ s of the firewall, and how Mule can work with complementary technology t
+ o address virtualization concerns.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090310T214627
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8081
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8081
+SUMMARY:What Zope did wrong, and how we fixed it
+DESCRIPTION:Presented by Lennart Regebro (Independent). Ten years old, Z
+ ope is the granddaddy of open source web frameworks. It introduced many 
+ new concepts that have spread through the web framework world. But not a
+ ll of them was such great ideas. This talk is about the bad ideas that y
+ our framework risk end up repeating.  It also talks about how these prob
+ lems have been fixed in Zope, and why Zope still is the leading edge of 
+ web development.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090713T230529
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8038
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8038
+SUMMARY:Writing Books using Open Source Software
+DESCRIPTION:Presented by wesley chun (CyberWeb Consulting). These days, 
+ there are countless number of software applications and web services tha
+ t have been developed using free and open source software (FOSS). Such t
+ ools have become so flexible, powerful, and universal, that it should al
+ so be possible for authors to write manuscripts using FOSS in the same w
+ ay that applications are developed. In this talk, we present some case s
+ tudies of this phenomenon.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090310T213149
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8074
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8074
+SUMMARY:Effective Job Interviewing from Both Sides of the Desk
+DESCRIPTION:Presented by Andy Lester (theworkinggeek.com). An engaging, 
+ frank discussion of the job interview, its failings, and how to make it 
+ work for all involved.  Effective interviewing reframes the interview as
+  what it really is: The candidate's first day on the job.  This session,
+  aimed at the specific needs of the technical professional, shows how ma
+ nager and candidate must work together for their common benefit.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090323T205650
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7548
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--7548
+SUMMARY:Version Control for Mere Mortals
+DESCRIPTION:Presented by Emma Jane Hogbin (HICK Tech). As a freelance de
+ veloper chances are good you use either many, or no, version control sys
+ tems for your code. If your mental health has been compromised by index.
+ version080912f-b.inc file naming, or you wish there was more flexibility
+  in how (and when) your files are submitted to data central, it’s possib
+ le that Bazaar is the version control system you’ve been waiting for.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090505T195950
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8896
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8896
+SUMMARY:Building a Business on Open Source Distributed Computing
+DESCRIPTION:Presented by Bradford Stephens (Visible Technologies). The e
+ nd of "scale-up" computing is near. The coming wave of web-scale data is
+  too big to justify exponentially increasing hardware costs for decreasi
+ ng returns. Apache's "Cloud Stack" (Hadoop, Lucene, HBase, etc) is enabl
+ ing Visible Technologies to move from a non-scalable MS-exclusive platfo
+ rm to a large cluster processing millions of pieces of content a day.Her
+ e's what we learned.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090311T144659
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7754
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--7754
+SUMMARY:"Design Patterns" in Dynamic Languages
+DESCRIPTION:Presented by Neal Ford (ThoughtWorks). Design patterns descr
+ ibe common problems in software development, but many people believe tha
+ t the GoF book demonstrates the best ways to implement these patterns. D
+ ynamic languages provide more facilities than C++ or Java; this session 
+ shows alternative implementations of design patterns using dynamic langu
+ ages (Ruby and Groovy).
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090316T134515
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8089
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8089
+SUMMARY:XDebug Your Code: Tips and Tricks for Writing Bug-Free High Impa
+ ct Code
+DESCRIPTION:Presented by Brandon Savage (Applied Security). Most develop
+ ers have heard of XDebug, but how many of them have actually used it to 
+ its full potential? Here we explore all the exciting things XDebug can d
+ o to improve code, from profiling to benchmarking to variable output.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T180500
+DTSTART;TZID=US/Pacific:20090723T172000
+DTSTAMP:20090310T220616
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8088
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-17:20--8088
+SUMMARY:What Open Source Projects Need to Know About Interacting with th
+ e Press
+DESCRIPTION:Presented by Esther Schindler (freelance writer and editor),
+  Steven Vaughan-Nichols (Practical Technology), Joe Brockmeier (Novell),
+  James Turner (O'Reilly Media), Jennifer  Cloer (Page One PR). Plenty of
+  FOSS projects yearn for visibility, within the tech press or in the lar
+ ger world. But few know how to respond when a journalist indicates inter
+ est. These experienced writers and editors will explain how your project
+  can get attention and present itself in the best possible light.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T183000
+DTSTART;TZID=US/Pacific:20090723T181500
+DTSTAMP:20090625T182346
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9004
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-18:15--9004
+SUMMARY:White Camel Awards
+DESCRIPTION:In the lands where the camel roams, the white (albino) camel
+  is a rare and revered individual. The White Camel Awards recognize the 
+ many significant contributions made by the unsung heros of the Perl comm
+ unity. The efforts of these volunteers collectively make the Perl langua
+ ge and the Perl community better for all of us.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T193000
+DTSTART;TZID=US/Pacific:20090723T183000
+ALTDTSTART;TZID=US/Pacific:20090723T181500
+DTSTAMP:20090529T172427
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9005
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-18:30--9005
+SUMMARY:State of the Onion Address
+DESCRIPTION:Presented by Larry Wall (Netlogic Microsystems). The OSCON t
+ radition continues as Larry Wall delivers the annual State of the Onion 
+ Address.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090528T233838
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9407
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--9407
+SUMMARY:Freedom For the Cloud: How We Learn to Control the Cloud and Liv
+ e Happy
+DESCRIPTION:This BoF will serve as introduction to the debate over the c
+ oncept of software freedom for cloud based applications and services. OS
+ CON attendants will learn what tools are available and will dig into the
+  wider concept of the 'cloud' and how the keys to the success of GNU/Lin
+ ux can be replicated in this evolved scenario.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090602T225645
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9678
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--9678
+SUMMARY:OpenJDK + You - Adding Open to JDK development
+DESCRIPTION:With more then 30 new committers within a year, OpenJDK has 
+ been growing quickly, but that's just a start -  if you are hacking on J
+ DK 7 or using one of the OpenJDK subprojects like Da Vinci VM, or just w
+ ant to get a taste for the direction in which JDK 7 is going, or want to
+  explore what it would take to get your favorite programming language ru
+ nning well on the JVM - come and join us at the BoF.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090716T182215
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10412
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10412
+SUMMARY:Dynamic Tracing of Your AMP Website
+DESCRIPTION:Ever wonder which PHP script or MySQL query in your web site
+  is keeping your system busy or how to quickly find out which module wit
+ hin your PHP application is struck ? Stop by to find out how simple DTra
+ ce skills can get this information painlessly.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090622T043727
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10195
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10195
+SUMMARY:OpenStreetMap
+DESCRIPTION:What's Open Source without Open Data as an input?  OpenStree
+ tMap is a set of free and open geodata.  You can use it as vectors (try 
+ THAT with Google Maps), as tiles, as a base layer for your GIS.  You can
+  overlay your data or contribute it if appropriate.  Let's talk about ma
+ ps and mapping!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090615T211454
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10175
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10175
+SUMMARY:Creating Communities Worldwide with phpBB
+DESCRIPTION:Organizations, businesses, clubs, and all kinds of user grou
+ ps around the world are using online bulletin boards to bring communitie
+ s together, and phpBB is the most widely used free and open source bulle
+ tin board solution online. Join local Bay Area phpBB users and team memb
+ ers to learn more about phpBB and how you can use it to bring your commu
+ nity together online.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090623T154313
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10201
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10201
+SUMMARY:SilverStripe - An Object-oriented Open Source CMS - Community Me
+ etup
+DESCRIPTION:SilverStripe is a PHP5-based CMS downloaded 160,000+ times. 
+ It focuses on being user friendly to end-users, and has an object orient
+ ed framework, Sapphire, within it, for developers.  Meet a founder and o
+ thers who use the software. Gain an overview of the project and ask lots
+  of questions!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090624T164216
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10212
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10212
+SUMMARY:Women in FLOSS and Allies Gathering
+DESCRIPTION:Women represent around 1-2% of FLOSS developers, and only a 
+ slightly higher percentage of OSCON attendees.  Let's meet and share exp
+ eriences, discuss tools for change, and get to know each other.  Women a
+ nd allies of other genders are all welcome.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090712T081056
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10214
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10214
+SUMMARY:What is Python?
+DESCRIPTION:Python's a simple & robust programming language that has an 
+ ever-increasing mindshare & number of worldwide users. It features an ea
+ sy-to-learn syntax that is clear & concise, making it popular for a wide
+  range of apps. This tutorial provides an in-depth introduction so you c
+ an get started right away! Come find out why Google, Yahoo, LucasFilm, V
+ Mware, Ubuntu, YouTube, & Red Hat all use Python.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090714T005657
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10379
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10379
+SUMMARY:Open Source goes to the Museum
+DESCRIPTION:Design a museum exhibit for The Tech Museum!  Win a cash pri
+ ze!  Help teach several hundred thousand kids a year about technology an
+ d open source!  Come to this BOF and learn more.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090715T121934
+LOCATION:Meeting Room C2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10392
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--10392
+SUMMARY:Going Social at NYTimes.com
+DESCRIPTION:The New York Times is first and foremost in the news busines
+ s. We don't want to be the next Facebook, Twitter, etc. But we see lots 
+ of potential for a community and social layer on NYTimes.com, and TimesP
+ eople is a great example of how we've begun to build that layer. Come sh
+ are your thoughts and ideas on how The New York Times can better turn it
+ s readers into users.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T200000
+DTSTART;TZID=US/Pacific:20090723T190000
+DTSTAMP:20090716T182231
+LOCATION:Meeting Room C3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9776
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-19:00--9776
+SUMMARY:Drizzle
+DESCRIPTION:Did you miss the Drizzle panel? Have a question that didn't 
+ get answered? Here's one more chance to discuss things!
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T210000
+DTSTART;TZID=US/Pacific:20090723T200000
+DTSTAMP:20090716T111313
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10448
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-20:00--10448
+SUMMARY:How I Built a Cool Monitoring Application Using Dojo, AJAX and R
+ EST
+DESCRIPTION:WEB2.0 and RIA (Rich Internet Applications) are the new plat
+ forms of developing web applications. Join this discussion on how open s
+ ource tools and frameworks were used to build the Web Stack Enterprise M
+ anager, a monitoring and management web application based on Dojo, AJAX 
+ and REST.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T210000
+DTSTART;TZID=US/Pacific:20090723T200000
+DTSTAMP:20090716T182148
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10442
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-20:00--10442
+SUMMARY:OSOSOS - Offering Security in OpenSource Operating Systems
+DESCRIPTION:Many operating system security mechanisms are necessary for 
+ developers to build secure software.  While this session presents a few 
+ such mechanisms available and under development in _OpenSolaris_, it pri
+ marily seeks the dialogue and discussion how important these features ar
+ e and how they compare to those of other OSes.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090723T220000
+DTSTART;TZID=US/Pacific:20090723T200000
+DTSTAMP:20090714T180852
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10349
+UID:http://conferences.oreilly.com/oscon--s2009-07-23-20:00--10349
+SUMMARY:BayPIGgies July Meeting
+DESCRIPTION:BayPIGgies is the Bay Area Python Interest Group, which meet
+ s on the fourth Thursday of every month.  In honor of OSCON moving to Sa
+ n Jose, we're switching our meeting location to the San Jose Convention 
+ Center for July.
+END:VEVENT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/OSCON20090724.ics	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,506 @@
+BEGIN:VCALENDAR
+X-WR-CALNAME:OSCON 2009
+VERSION:2.0
+PRODID:Expectnation
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T091500
+DTSTART;TZID=US/Pacific:20090724T090000
+DTSTAMP:20090716T203002
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10458
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-09:00--10458
+SUMMARY:Applying Open Source Principles to Federal Government
+DESCRIPTION:Presented by Gunnar  Hellekson (Red Hat Government). The cur
+ rent Administration talks the talk in terms of its adoption of new techn
+ ology solutions, access to information, and the call for transparency an
+ d increased citizen participation.  But can it walk the walk?  This keyn
+ ote will address how open source advocates can help the Federal Governme
+ nt unlock the innovative potential of the open source development model.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T140000
+DTSTART;TZID=US/Pacific:20090724T090000
+DTSTAMP:20090702T000544
+LOCATION:Meeting Room N
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10251
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-09:00--10251
+SUMMARY:Sunlight Labs Hackathon
+DESCRIPTION:At the Sunlight Labs hackathon, Sunlight Labs will be workin
+ g with developers on two major projects: 1. Parsing sites at for our 50 
+ state project to get every state legislature in a common data format, an
+ d 2. Adding data into Sunlight's newest project, Congrelate.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T093000
+DTSTART;TZID=US/Pacific:20090724T091500
+ALTDTSTART;TZID=US/Pacific:20090724T090000
+DTSTAMP:20090422T154805
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9099
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-09:15--9099
+SUMMARY:Fundamentalist Functional Programming
+DESCRIPTION:Presented by Erik Meijer (Microsoft). This talk argues that 
+ fundamentalist functional programming-that is, radically eliminating all
+  side effects from programming languages, including strict evaluation-is
+  what it takes to conquer the concurrency and parallelism dragon.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T094500
+DTSTART;TZID=US/Pacific:20090724T093000
+ALTDTSTART;TZID=US/Pacific:20090724T090000
+DTSTAMP:20090716T162302
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10456
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-09:30--10456
+SUMMARY:The Rewilding: A Metaphor
+DESCRIPTION:Presented by Karl Schroeder. Open source software.  Ecosyste
+ m services, distributed "smart" electrical grids, and sustainable econom
+ ics. Collective intelligence, the Science Commons, and Wikipedia.  What 
+ do all these have in common? They seem to represent a new ethos of "lett
+ ing go" of centralized control--in project management, industrial and ec
+ onomic infrastructure, and culture.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T100000
+DTSTART;TZID=US/Pacific:20090724T094500
+ALTDTSTART;TZID=US/Pacific:20090724T090000
+DTSTAMP:20090601T161557
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9248
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-09:45--9248
+SUMMARY:Where Next for Openness?
+DESCRIPTION:Presented by Mark Surman (Mozilla Foundation). Openness and 
+ participation are now a pervasive part of digital life. Firefox. Wikiped
+ ia. Apache. Linux. Millions of Creative Commons pictures on Flickr. We h
+ ave moved mountains. The question is: what's next?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T101500
+DTSTART;TZID=US/Pacific:20090724T100000
+ALTDTSTART;TZID=US/Pacific:20090724T090000
+DTSTAMP:20090325T171901
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9017
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:00--9017
+SUMMARY:Q & A
+DESCRIPTION:An open microphone question and answer session with the morn
+ ing's keynote speakers.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090311T020212
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8165
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--8165
+SUMMARY:The Art of Klingon Programming
+DESCRIPTION:Presented by Paul Fenwick (Perl Training Australia). A good 
+ programmer needs many qualities: intelligence, foresight, dedication, an
+ d the ability to fight off a hundred angry targh armed only with your ba
+ t'leth. On Qo'noS, software developers undertake an intensive course in 
+ combat programming before they are cleared for active duty. Join Paul Fe
+ nwick as he examines how Perl's new autodie pragma can bring you the ver
+ y best of Klingon programming.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090714T182503
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8862
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--8862
+SUMMARY:Recent Advances in the Linux Kernel Resource Management
+DESCRIPTION:Presented by Kirill Kolyshkin (OpenVZ). The talk outlines th
+ e standard Linux kernel mechanisms for controlling resources (such as CP
+ U, RAM, disk) and reveals their shortcomings. It explains what are conta
+ iners and why resource management is important for those. A new Linux ke
+ rnel features -- cgroups and memory controller -- are explained in detai
+ ls, with some tricky implementation details and a look into what else ha
+ s yet to be done.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090320T170912
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8395
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--8395
+SUMMARY:Open APIs of The New York Times
+DESCRIPTION:Presented by Derek Gottfrid (The New York Times). We have em
+ barked on a mission to share more of what we do on the development side 
+ of The Times. So far, we’ve done that via conference presentations, open
+ -source software, blog posts and (most recently and probably most import
+ antly) our APIs. We see our site as more than just a source of news and 
+ information: it’s a platform on which news and information become buildi
+ ng blocks.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090310T213213
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8376
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--8376
+SUMMARY:Forking Encouraged: Folk Programming, Open Source, and Social So
+ ftware Development
+DESCRIPTION:Presented by Kirrily Robert (Metaweb), Yoz Grahame (Linden L
+ ab), Jason Douglas (Metaweb). The term "Folk Computing" was coined 20+ y
+ ears ago to describe how people learn to program by copying and experime
+ ntation.  Learn how open source licenses, hosted development environment
+ s, and other folk programming concepts lower barriers to entry and help 
+ people get up to speed as coders.  We'll also be showing off some modern
+  folk programming platforms, from Yahoo Pipes to the OLPC and beyond.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090604T162038
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9093
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--9093
+SUMMARY:Democratizing the Cloud Using the LiveLabs Reactive Framework
+DESCRIPTION:Presented by Erik Meijer (Microsoft). By leveraging the fact
+  that the iterator and the subject/observer design pattern are dual, we 
+ show how LINQ query comprehensions and imperative iterators and foreach 
+ loops, provide a compositional programming model for reactive and distri
+ buted programming.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090415T180459
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8335
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--8335
+SUMMARY:The Bee: UNICEF's Portable Infrastructure for Emergency Communic
+ ations
+DESCRIPTION:Presented by Seth  Herr (UNICEF), Merrick Schaefer (UNICEF).
+  The Bee is an emergency communications system utilizing innovative open
+ -source hardware and software. The Bee can be deployed anywhere in the w
+ orld, can navigate power and connectivity challenges, and can be checked
+  as baggage on commercial airlines. It's rugged, customizable, and desig
+ ned to contribute to the community long after the crisis has passed.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090318T002433
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7936
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--7936
+SUMMARY:Goal Driven Performance Application
+DESCRIPTION:Presented by Peter Zaitsev (MySQL Performance Blog). So you 
+ have ambiguous task to optimize Web Site Performance and you have few re
+ sources and time available. How to make the biggest impact with them ? T
+ his presentation gives you insight in methodology show practical tips an
+ d tools for web site performance optimization.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090310T214156
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7949
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--7949
+SUMMARY:Moving into the Cloud
+DESCRIPTION:Presented by Bernard Golden (HyperStratus). Many new applica
+ tions are being created to take advantage of cloud computing. But what a
+ bout the enormous installed base of existing apps? How can those leverag
+ e cloud computing? This presentation describes migrating an existing app
+ lication into Amazon's EC2, and covers the technical, organizational, an
+ d financial aspects of migration.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090406T150441
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8856
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--8856
+SUMMARY:The HTML 5 Experiments
+DESCRIPTION:Presented by Bruce Lawson (Opera Software ASA). A pragmatic 
+ look at HTML 5 by experimenting with converting a real site to HTML 5 - 
+ how does it work? Where it useful and where is it annoying? How is suppo
+ rt in current browsers?
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090505T214002
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8190
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--8190
+SUMMARY:What's in a Name: Can Trademarks be Helpful to Free Software Pro
+ jects?
+DESCRIPTION:Presented by Karen Sandler (Software Freedom Law Center), Si
+ mon  Phipps (Sun Microsystems), Gervase Markham (Mozilla Foundation), La
+ rry Augustin (SugarCRM), Chris Messina (OpenID Foundation). Trademark la
+ w is designed to prevent confusion in the market place but understanding
+  how it can benefit the FOSS community can often be confusing. This pane
+ l will discuss whether it is useful to register a trademark and, if so, 
+ how to permit its use by others. Various policies and enforcement strate
+ gies will be evaluated from  corporate and non-profit perspectives, ofte
+ n in strong disagreement.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090310T223011
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7985
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--7985
+SUMMARY:The Freedom to Cure Cancer: Open Source Software in Genomics
+DESCRIPTION:Presented by David Dooling (The Genome Center at Washington 
+ University in St. Louis). It has long been know that free/libre/open sou
+ rce software (FLOSS), especially GNU/Linux and Perl, played a major role
+  in the Human Genome Project. This presentation will discuss the use and
+  development of FLOSS in the post-genomics era, focusing on its pervasiv
+ e use in sequencing the first cancer genome at The Genome Center at Wash
+ ington University in St. Louis.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090313T181028
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7946
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--7946
+SUMMARY:Conventional Thinking, a guide to database naming standards
+DESCRIPTION:Presented by Robert Treat (OmniTI). Everyone agrees that we 
+ need coding standards, but they often overlook the need to define a nami
+ ng standard for thier SQL and database related items. This talk we not b
+ e a top-down explination of "the right way to do it", but rather we'll e
+ xplore the key issues you need to be aware of, from all sides,  and help
+  you determine the right standards for your organization.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T113000
+DTSTART;TZID=US/Pacific:20090724T104500
+DTSTAMP:20090311T000332
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7623
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-10:45--7623
+SUMMARY:The JSON Saga
+DESCRIPTION:Presented by Douglas Crockford (Yahoo! Inc.). How JSON overc
+ ame intolerance, inurement, and death threats to become the preferred da
+ ta interchange format.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090422T230607
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8060
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8060
+SUMMARY:The Conway Channel
+DESCRIPTION:Presented by Damian Conway (Thoughtstream). The usual smorga
+ sbord of new and improbably useful modules beamed straight into your min
+ d from the secret island hideaway of Perl's own Dr Evil.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090310T230330
+LOCATION:Ballroom A1
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8452
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8452
+SUMMARY:How Green Is Our City? The Urban Forest Mapping Project
+DESCRIPTION:Presented by Kelaine Vargas (Urban Forest Map). The Urban Fo
+ rest Mapping Project will map every tree in San Francisco using online i
+ nput from community members as well as official data, and calculate the 
+ ecosystem services the urban forest is providing. This web-based, open-s
+ ource application makes use of crowd-sourced data from "citizen scientis
+ ts" to help us use our urban natural resources to increase sustainabilit
+ y.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090312T021906
+LOCATION:Ballroom A2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8153
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8153
+SUMMARY:NPR, Open Content and API's
+DESCRIPTION:Presented by Daniel Jacobson (National Public Radio). It has
+  been a year since NPR's public API launched (announced at OSCON 2008). 
+  This session will explore how the marketplace has changed for media org
+ anizations over the last year, how API's have played a role in that chan
+ ge, and what the future looks like for NPR, its API, and other media org
+ anizations.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090310T215150
+LOCATION:Ballroom A3/A6
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7841
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--7841
+SUMMARY:Practical Computerized Home Automation
+DESCRIPTION:Presented by Bruce Momjian (EnterpriseDB), Matthew Momjian (
+ Student). You can control devices in your home from your computer with n
+ o new wiring. This session covers controlling lights, bells, and motors 
+ using open source software.    Wireless remotes can also control devices
+ .  Sensors can provide information about motion, sunset, temperature.  C
+ apturing caller id and auto-dialing is also covered.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090310T214824
+LOCATION:Ballroom A4/A5
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8408
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8408
+SUMMARY:Stream Fusion: Beautiful Performance in Haskell
+DESCRIPTION:Presented by Bryan O'Sullivan (Serpentine Green Design). The
+  Haskell language makes it possible to write elegant code while achievin
+ g top-notch performance. We'll introduce you to the features that make f
+ ast code possible, focusing on one of the newest and most exciting techn
+ iques for number crunching and text processing: stream fusion.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090311T235210
+LOCATION:Ballroom A7
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8442
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8442
+SUMMARY:Security Without Disruption: Ksplice Kernel Updates
+DESCRIPTION:Presented by Jeff Arnold (Ksplice, Inc.). Today, every mains
+ tream operating system in the world requires regular reboots in order to
+  be up to date and secure.  Since reboots cause downtime and disruption,
+  people are forced into the uncomfortable dilemma of choosing between se
+ curity and convenience. New open source technology out of MIT, called Ks
+ plice, enables running systems to stay secure without the disruption of 
+ rebooting.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090310T213836
+LOCATION:Ballroom A8
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8426
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8426
+SUMMARY:High Performance APC
+DESCRIPTION:Presented by Brian Shire (Facebook, Inc.), Graham Kelly (Fac
+ ebook, Inc.). The Alternative PHP Cache is an opcode and variable cache 
+ for PHP that can be used to improve PHP performance, scalability, and en
+ d user experience.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090310T231026
+LOCATION:Meeting Room B1/B4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8563
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8563
+SUMMARY:Scan Open Source Report 2008 and the Architecture Library
+DESCRIPTION:Presented by David Maxwell (Coverity, Inc.). This talk will 
+ present the 2008 results from the Scan Project, a Department of Homeland
+  Security open source initiative run by Coverity, designed to improve th
+ e quality and security of popular open source projects used to power gov
+ ernment and private websites.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090311T050608
+LOCATION:Meeting Room B2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/8331
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--8331
+SUMMARY:Crash Reporting: Mozilla's Open Source Solution
+DESCRIPTION:Presented by K Lars  Lohn (Mozilla Corporation), Ted Mielcza
+ rek (Mozilla Corporation), Austin King (Mozila Corporation). Mozilla's o
+ pen source crash reporting system premiered in Firefox 3.0.  Combining t
+ he Google Breakpad and Mozilla Socorro projects, Mozilla has created a s
+ ystem that allows millions of  client applications to report crashes bac
+ k to a central location for analysis. This talk is intended for people i
+ nterested in how the new Firefox crash reporting works and how it is app
+ licable to other projects.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090624T070410
+LOCATION:Meeting Room B3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/9257
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--9257
+SUMMARY:Automating the Cloud with Chef
+DESCRIPTION:Presented by Adam Jacob (Opscode). Infrastructure is code - 
+ the separation between how you manage your infrastructure and how you bu
+ ild your applications is disappearing.  Adam Jacob, CTO of Opscode and p
+ rimary author of Chef, will teach you what this means in practice - thro
+ ugh showing how to deploy real-world applications with Chef on EC2.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090311T032948
+LOCATION:Meeting Room J1/J4
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7889
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--7889
+SUMMARY:Sex, Drugs and XMPP
+DESCRIPTION:Presented by Paul Scott (University of the Western Cape). XM
+ PP is a cheap, low bandwidth alternative to the web in bandwidth poor co
+ untries. This talk will show how we have used XMPP networks to address s
+ ocial problems like gansterism, drug abuse and HIV AIDS.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090310T221803
+LOCATION:Meeting Room J2
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7955
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--7955
+SUMMARY:What Every Developer Should Know About Database Scalability
+DESCRIPTION:Presented by Jonathan Ellis (Rackspace Hosting). Replication
+ .  Partitioning.  Relational databases.  Bigtable.  Dynamo. There is no 
+ one-size-fits-all approach to scaling your database, and the CAP theorem
+  proved that there never will be.  This talk will explain the advantages
+  and limits of the approaches to scaling traditional relational database
+ s, as well as the tradeoffs made by the designers of newer systems like 
+ Google's Bigtable.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T122000
+DTSTART;TZID=US/Pacific:20090724T113500
+DTSTAMP:20090313T053329
+LOCATION:Meeting Room J3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/7850
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-11:35--7850
+SUMMARY:Building and Running An Open-Source Community: The FreeBSD Proje
+ ct
+DESCRIPTION:Presented by Marshall Kirk McKusick (Marshall Kirk McKusick 
+ Consultancy). This talk will tell the story of the the FreeBSD project w
+ hich started from the open-source release of 4.4BSD-Lite from the Univer
+ sity of California at Berkeley.  The FreeBSD project patterned its initi
+ al community structure on the development structure built up at Berkeley
+ .
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T133000
+DTSTART;TZID=US/Pacific:20090724T123000
+DTSTAMP:20090716T165536
+LOCATION:Exhibit Hall 3
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10416
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-12:30--10416
+SUMMARY:Moblin, Chrome, Android, Ubuntu, etc: What's the Deal with Linux
+  on the Desktop?
+DESCRIPTION:Presented by Jim Zemlin (The Linux Foundation). Join Jim Zem
+ lin as he takes a look back at the big moves that drove Linux to dominat
+ e the server and super computing markets and how we are seeing similar t
+ rends start now in the desktop.
+END:VEVENT
+BEGIN:VEVENT
+DTEND;TZID=US/Pacific:20090724T140000
+DTSTART;TZID=US/Pacific:20090724T133000
+DTSTAMP:20090710T164522
+LOCATION:Concourse Two
+URL:http://en.oreilly.com/oscon2009/public/schedule/detail/10409
+UID:http://conferences.oreilly.com/oscon--s2009-07-24-13:30--10409
+SUMMARY:Closing Reception
+DESCRIPTION:Join us at the "build your own Hamburger bar".  Enjoy burger
+ s, veggie crudites, soda pop, and water.  Take this opportunity to netwo
+ rk one last time at this closing event. Say thank you and exchange conta
+ ct information until next year.
+END:VEVENT
Binary file OSCON/WRTKit/Resources/CheckBox.png has changed
Binary file OSCON/WRTKit/Resources/ContentPanelFoldIcons.png has changed
Binary file OSCON/WRTKit/Resources/ControlAssemblyBackground.png has changed
Binary file OSCON/WRTKit/Resources/DocumentBackground.png has changed
Binary file OSCON/WRTKit/Resources/FormButtonCenter.png has changed
Binary file OSCON/WRTKit/Resources/FormButtonLeft.png has changed
Binary file OSCON/WRTKit/Resources/FormButtonRight.png has changed
Binary file OSCON/WRTKit/Resources/ListViewCaptionBackground.png has changed
Binary file OSCON/WRTKit/Resources/NotificationPopupBackground.png has changed
Binary file OSCON/WRTKit/Resources/NotificationPopupTypeIndicator.png has changed
Binary file OSCON/WRTKit/Resources/ProgressBarUnknown.gif has changed
Binary file OSCON/WRTKit/Resources/RadioButton.png has changed
Binary file OSCON/WRTKit/Resources/ScrollbarThumbBottom.png has changed
Binary file OSCON/WRTKit/Resources/ScrollbarThumbMiddle.png has changed
Binary file OSCON/WRTKit/Resources/ScrollbarThumbTop.png has changed
Binary file OSCON/WRTKit/Resources/ScrollbarTrackBottom.png has changed
Binary file OSCON/WRTKit/Resources/ScrollbarTrackMiddle.png has changed
Binary file OSCON/WRTKit/Resources/ScrollbarTrackTop.png has changed
Binary file OSCON/WRTKit/Resources/SeparatorCenter.png has changed
Binary file OSCON/WRTKit/Resources/SeparatorLeft.png has changed
Binary file OSCON/WRTKit/Resources/SeparatorRight.png has changed
Binary file OSCON/WRTKit/Resources/Thumbs.db has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/Resources/UI.css	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,925 @@
+	/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/******************************************************************************/
+/*        Definition of visuals for the WRTKit user interface toolkit         */
+/******************************************************************************/
+
+/* Fix for font size inheritance */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
+blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl,
+dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody,
+tfoot, thead, tr, th, td {
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+}
+
+
+/******************************************************************************/
+/* Document body rules */
+
+body {
+    margin: 0px;
+    background: url("DocumentBackground.png") repeat;  /* repeat-x fixed; */
+    font: normal 14px Arial, sans-serif;
+    color: rgb(255,255,255);
+}
+ 
+
+
+/******************************************************************************/
+/* Override default WRT styling for HTML form controls */
+
+/* Textarea when focused */
+textarea:focus {
+    outline: none;
+}
+
+/* Textarea when hovering */
+textarea:hover {
+    outline: none;
+}
+
+/* Select elements when focused */
+select:focus {
+    outline: none;
+}
+
+/* Select elements when hovering */
+select:hover {
+    outline: none;
+}
+
+/* Input elements when focused */
+input:focus {
+    outline: none;
+}
+
+/* Input elements when hovering */
+input:hover {
+    outline: none;
+}
+
+/* Link elements */
+a {
+    text-decoration: none;
+    color: rgb(255,255,255);
+}
+
+/* Links when focused */
+a:focus {
+    background: none;
+    outline: none;
+}
+
+/* Links when hovering */
+a:hover {
+    background: none;
+    outline: none;
+}
+
+
+/******************************************************************************/
+/* Rules for default view and document scrollbar containers */
+
+/* Default view container rules */
+.ViewContainer {
+    margin: 0px 0px 0px 0px;
+}
+
+/* Default document scrollbar container rules */
+.DocumentScrollbarContainer {
+    position: fixed;
+    right: 0px;
+    top: 0px;
+    height: 100%;
+    width: 7px;
+}
+
+
+/******************************************************************************/
+/* View style rules */
+
+/* Rules for the list view */
+.ListView {
+    margin: 0px 0px 0px 0px;
+}
+
+/* Rules for the list view caption */
+.ListViewCaption {
+    background: url("ListViewCaptionBackground.png");
+    height: 35px;
+}
+
+/* Rules for the list view caption text */
+.ListViewCaptionText {
+    font-size: 1.2em;
+    font-weight: bold;
+    padding: 7px 0px 0px 11px;
+}
+
+/* Rules for the list view control list element */
+.ListViewControlList {
+    margin: 1px 10px 1px 3px;
+}
+
+
+/******************************************************************************/
+/* Control style rules */
+
+/* Rules for control root element (rootElement) */
+.Control {
+    
+}
+
+/* Control assembly rules (assemblyElement) */
+.ControlAssembly {
+    background: url("ControlAssemblyBackground.png") repeat-x;
+    padding: 1px 5px;
+}
+
+/* Control assembly in normal state */
+.ControlAssemblyNormal {
+    background-position: 0px 0px;
+}
+
+/* Control assembly in focused state */
+.ControlAssemblyFocus {
+    background-position: 0px -250px;
+}
+
+/* Control assembly in hovering state */
+.ControlAssemblyHover {
+    background-position: 0px -500px;
+}
+
+/* Control assembly in disabled state */
+.ControlAssemblyDisabled {
+    background-position: 0px 0px;
+}
+
+/* Caption for controls (captionElement) */
+.ControlCaption {
+    font-weight: bold;
+    padding: 3px 0px 0px 3px;
+}
+
+/* Caption for controls in normal state */
+.ControlCaptionNormal {
+    
+}
+
+/* Caption for controls when focused */
+.ControlCaptionFocus {
+    color: rgb(255,255,255);
+}
+
+/* Caption for controls when hovering */
+.ControlCaptionHover {
+    
+}
+
+/* Caption for controls when disabled */
+.ControlCaptionDisabled {
+    color: rgb(185,185,185);
+}
+
+/* Control element rules (controlElement) */
+.ControlElement {
+    padding: 3px 3px 3px 3px;
+}
+
+/******************************************************************************/
+/* Label */
+
+/* Rules for the text value of a Label control */
+.LabelText {
+    
+}
+
+
+/******************************************************************************/
+/* ContentPanel */
+
+/* Caption area rules for non-foldable content panels */
+.ContentPanelCaptionNonFoldable {
+    padding: 3px 0px 0px 3px;
+}
+
+/* Caption area rules for foldable content panels */
+.ContentPanelCaptionFoldable {
+    padding: 4px 0px 3px 3px;
+}
+
+/* Rules for fold toggling element in content panel */
+.ContentPanelFoldToggle {
+    background: url("ContentPanelFoldIcons.png") no-repeat;
+    padding-left: 16px;
+}
+
+/* Collapsed fold */
+.ContentPanelFoldToggleCollapsed {
+    background-position: 0px 0px;
+}
+
+/* Expanded fold */
+.ContentPanelFoldToggleExpanded {
+    background-position: 0px -150px;
+}
+
+/* Rules for the content panel caption text */
+.ContentPanelCaptionText {
+    font-weight: bold;
+}
+
+/* Caption text for content panel in normal state */
+.ContentPanelCaptionTextNormal {
+    
+}
+
+/* Caption text for content panel when focused */
+.ContentPanelCaptionTextFocus {
+    color: rgb(255,255,255);
+}
+
+/* Caption text for content panel when hovering */
+.ContentPanelCaptionTextHover {
+    
+}
+
+/* Caption text for content panel when disabled */
+.ContentPanelCaptionTextDisabled {
+    color: rgb(185,185,185);
+}
+
+/* Rules for content in the content panel */
+.ContentPanelContent {
+    padding: 2px 2px 2px 8px;
+}
+
+
+/******************************************************************************/
+/* FormButton */
+
+/* Rules for form button */
+.FormButton {
+    
+}
+
+/* Rules for form button control element */
+.FormButtonControlElement {
+    
+}
+
+/* Rules for form button table (table) */
+.FormButtonTable {
+    width: 100%;
+    border-spacing: 0px;
+    padding: 0px;
+    table-layout: fixed;
+}
+
+/* Form button row (tr) */
+.FormButtonRow {
+    padding: 0px;
+}
+
+/* Rules for form button left cell (td) */
+.FormButtonLeftCell {
+    width: 8px;
+    height: 26px;
+    background: url("FormButtonLeft.png") no-repeat;
+    padding: 0px;
+}
+
+/* Rules for form button center cell (td) */
+.FormButtonCenterCell {
+    height: 26px;
+    background: url("FormButtonCenter.png") repeat-x;
+    padding: 0px;
+    vertical-align: middle;
+    text-align: center;
+}
+
+/* Rules for form button right cell (td) */
+.FormButtonRightCell {
+    width: 8px;
+    height: 26px;
+    background: url("FormButtonRight.png") no-repeat;
+    padding: 0px;
+}
+
+/* Rules for form button left cell in normal state (td) */
+.FormButtonLeftCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button left cell in focused state (td) */
+.FormButtonLeftCellFocus {
+    background-position: 0px -50px;
+}
+
+/* Rules for form button left cell in hover state (td) */
+.FormButtonLeftCellHover {
+    background-position: 0px -100px;
+}
+
+/* Rules for form button left cell in disabled state (td) */
+.FormButtonLeftCellDisabled {
+    background-position: 0px -150px;
+}
+
+/* Rules for form button center cell in normal state (td) */
+.FormButtonCenterCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button center cell in focused state (td) */
+.FormButtonCenterCellFocus {
+    background-position: 0px -50px;
+}
+
+/* Rules for form button center cell in hover state (td) */
+.FormButtonCenterCellHover {
+    background-position: 0px -100px;
+}
+
+/* Rules for form button center cell in disabled state (td) */
+.FormButtonCenterCellDisabled {
+    background-position: 0px -150px;
+}
+
+/* Rules for form button left cell in normal state (td) */
+.FormButtonRightCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button left cell in focused state (td) */
+.FormButtonRightCellFocus {
+    background-position: 0px -50px;
+}
+
+/* Rules for form button left cell in hover state (td) */
+.FormButtonRightCellHover {
+    background-position: 0px -100px;
+}
+
+/* Rules for form button left cell in disabled state (td) */
+.FormButtonRightCellDisabled {
+    background-position: 0px -150px;
+}
+
+/* Rules for form button text */
+.FormButtonText {
+    font-weight: bold;
+}
+
+/* Form button text in normal state */
+.FormButtonTextNormal {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when focused */
+.FormButtonTextFocus {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when hovering */
+.FormButtonTextHover {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when disabled */
+.FormButtonTextDisabled {
+    color: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* NavigationButton */
+
+/* Rules for navigation button */
+.NavigationButton {
+    
+}
+
+/* Rules for navigation button control element */
+.NavigationButtonControlElement {
+    padding: 3px 3px 3px 3px;
+}
+
+/* Rules for navigation button table (table) */
+.NavigationButtonTable {
+    border-spacing: 0px;
+    padding: 0px;
+}
+
+/* Navigation button row (tr) */
+.NavigationButtonRow {
+    padding: 0px;
+}
+
+/* Rules for navigation button image cell (td) */
+.NavigationButtonImageCell {
+    line-height: 1px;
+    font-size: 1px;
+    vertical-align: middle;
+}
+
+/* Rules for navigation button text cell (td) */
+.NavigationButtonTextCell {
+    vertical-align: middle;
+    padding: 0px;
+}
+
+/* Rules for navigation button image */
+.NavigationButtonImage {
+    padding: 0px 5px 0px 0px;
+}
+
+/* Rules for navigation button text */
+.NavigationButtonText {
+    font-weight: bold;
+}
+
+/* Navigation button text in normal state */
+.NavigationButtonTextNormal {
+    
+}
+
+/* Navigation button text when focused */
+.NavigationButtonTextFocus {
+    color: rgb(255,255,255);
+}
+
+/* Navigation button text when hovering */
+.NavigationButtonTextHover {
+    
+}
+
+/* Navigation button text when disabled */
+.NavigationButtonTextDisabled {
+    color: rgb(185,185,185);
+}
+
+
+/******************************************************************************/
+/* TextField */
+
+/* Rules for textField */
+.TextField {
+    width: 100%;
+    border: 1px solid rgb(255,255,255);
+    background: rgb(57,56,52);
+    margin: 0px 0px 3px 0px;
+}
+
+/* TextField in normal state */
+.TextFieldNormal {
+    
+}
+
+/* TextField in focus state */
+.TextFieldFocus {
+    
+}
+
+/* TextField in hover state */
+.TextFieldHover {
+    
+}
+
+/* TextField in disabled state */
+.TextFieldDisabled {
+    color: rgb(185,185,185);
+    background: rgb(57,56,52);
+}
+
+
+/******************************************************************************/
+/* TextArea */
+
+/* Rules for TextArea */
+.TextArea {
+    width: 100%;
+    border: 1px solid rgb(255,255,255);
+    background: rgb(57,56,52);
+    margin: 0px 0px 3px 0px;
+}
+
+/* TextArea in normal state */
+.TextAreaNormal {
+    
+}
+
+/* TextArea in focus state */
+.TextAreaFocus {
+    
+}
+
+/* TextArea in hover state */
+.TextAreaHover {
+    
+}
+
+/* TextArea in disabled state */
+.TextAreaDisabled {
+    color: rgb(185,185,185);
+    background: rgb(57,56,52);
+}
+
+
+/******************************************************************************/
+/* Separator */
+
+/* Rules for Separator (table) */
+.Separator {
+    width: 100%;
+    padding: 0px;
+    border-spacing: 0px;
+    table-layout: fixed;
+    margin: 3px 0px;
+}
+
+/* Separator row (tr) */
+.SeparatorRow {
+    padding: 0px;
+}
+
+/* Separator left cell (td) */
+.SeparatorLeftCell {
+    width: 5px;
+    height: 2px;
+    background: url("SeparatorLeft.png") no-repeat;
+    padding: 0px;
+}
+
+/* Separator center cell (td) */
+.SeparatorCenterCell {
+    height: 2px;
+    background: url("SeparatorCenter.png") repeat-x;
+    padding: 0px;
+}
+
+/* Separator right cell (td) */
+.SeparatorRightCell {
+    width: 6px;
+    height: 2px;
+    background: url("SeparatorRight.png") no-repeat;
+    padding: 0px;
+}
+
+
+/******************************************************************************/
+/* SelectionMenu */
+
+/* Rules for SelectionMenu select element */
+.SelectionMenu {
+    width: 100%;
+    border: 1px solid rgb(255,255,255);
+    background: rgb(57,56,52);
+    margin: 0px 0px 3px 0px;
+}
+
+/* SelectionMenu in normal state */
+.SelectionMenuNormal {
+    
+}
+
+/* SelectionMenu in focus state */
+.SelectionMenuFocus {
+    
+}
+
+/* SelectionMenu in hover state */
+.SelectionMenuHover {
+    
+}
+
+/* SelectionMenu in disabled state */
+.SelectionMenuDisabled {
+    color: rgb(185,185,185);
+    background: rgb(57,56,52);
+}
+
+/* Rules for SelectionMenu option elements */
+.SelectionMenuOption {
+    background: rgb(57,56,52);
+}
+
+/* SelectionMenu option in normal state */
+.SelectionMenuOptionNormal {
+    
+}
+
+/* SelectionMenu option in focus state */
+.SelectionMenuOptionFocus {
+    
+}
+
+/* SelectionMenu option in hover state */
+.SelectionMenuOptionHover {
+    
+}
+
+/* SelectionMenu option in disabled state */
+.SelectionMenuOptionDisabled {
+    color: rgb(185,185,185);
+    background: rgb(57,56,52);
+}
+
+
+/******************************************************************************/
+/* SelectionList */
+
+/* SelectionList option list element */
+.SelectionList {
+    
+}
+
+/* SelectionList option list element in normal state */
+.SelectionListNormal {
+    
+}
+
+/* SelectionList option list element in focus state */
+.SelectionListFocus {
+    
+}
+
+/* SelectionList option list element in hover state */
+.SelectionListHover {
+    
+}
+
+/* SelectionList option list element in disabled state */
+.SelectionListDisabled {
+    
+}
+
+/* SelectionList option element in single selection mode */
+.SelectionListOptionSingle {
+    padding-left: 19px;
+    background: url("RadioButton.png") no-repeat;
+    height: 16px;
+}
+
+/* SelectionList option element in single selection mode, unchecked normal state */
+.SelectionListOptionSingleUncheckedNormal {
+    background-position: 0px 0px;
+}
+
+/* SelectionList option element in single selection mode, unchecked focus state */
+.SelectionListOptionSingleUncheckedFocus {
+    background-position: 0px -50px;
+}
+
+/* SelectionList option element in single selection mode, unchecked diabled state */
+.SelectionListOptionSingleUncheckedDisabled {
+    background-position: 0px -100px;
+}
+
+/* SelectionList option element in single selection mode, checked normal state */
+.SelectionListOptionSingleCheckedNormal {
+    background-position: 0px -150px;
+}
+
+/* SelectionList option element in single selection mode, checked focus state */
+.SelectionListOptionSingleCheckedFocus {
+    background-position: 0px -200px;
+}
+
+/* SelectionList option element in single selection mode, checked diabled state */
+.SelectionListOptionSingleCheckedDisabled {
+    background-position: 0px -250px;
+}
+
+/* SelectionList option element in multi selection mode */
+.SelectionListOptionMulti {
+    padding-left: 19px;
+    background: url("CheckBox.png") no-repeat;
+    height: 16px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked normal state */
+.SelectionListOptionMultiUncheckedNormal {
+    background-position: 0px 0px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked focus state */
+.SelectionListOptionMultiUncheckedFocus {
+    background-position: 0px -50px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked diabled state */
+.SelectionListOptionMultiUncheckedDisabled {
+    background-position: 0px -100px;
+}
+
+/* SelectionList option element in multi selection mode, checked normal state */
+.SelectionListOptionMultiCheckedNormal {
+    background-position: 0px -150px;
+}
+
+/* SelectionList option element in multi selection mode, checked focus state */
+.SelectionListOptionMultiCheckedFocus {
+    background-position: 0px -200px;
+}
+
+/* SelectionList option element in multi selection mode, checked diabled state */
+.SelectionListOptionMultiCheckedDisabled {
+    background-position: 0px -250px;
+}
+
+/* SelectionList option text */
+.SelectionListOptionText {
+    
+}
+
+/* SelectionList option text in normal state */
+.SelectionListOptionTextNormal {
+    
+}
+
+/* SelectionList option text in focus state */
+.SelectionListOptionTextFocus {
+    color: rgb(255,255,255);
+}
+
+/* SelectionList option text in hover state */
+.SelectionListOptionTextHover {
+    
+}
+
+/* SelectionList option text in disabled state */
+.SelectionListOptionTextDisabled {
+    color: rgb(185,185,185);
+}
+
+
+/******************************************************************************/
+/* Scrollbar */
+
+/* Scrollbar root element */
+.Scrollbar {
+    position: absolute;
+    height: 100%;
+    width: 7px;
+}
+
+/* Top portion of scrollbar track */
+.ScrollbarTrackTop {
+    position: absolute;
+    background: url("ScrollbarTrackTop.png") no-repeat;
+    width: 7px;
+    height: 4px;
+}
+
+/* Middle portion of scrollbar track */
+.ScrollbarTrackMiddle {
+    position: absolute;
+    background: url("ScrollbarTrackMiddle.png") repeat-y;
+    width: 7px;
+}
+
+/* Bottom portion of scrollbar track */
+.ScrollbarTrackBottom {
+    position: absolute;
+    background: url("ScrollbarTrackBottom.png") no-repeat;
+    width: 7px;
+    height: 4px;
+}
+
+/* Top portion of scrollbar thumb */
+.ScrollbarThumbTop {
+    position: absolute;
+    background: url("ScrollbarThumbTop.png") no-repeat;
+    width: 7px;
+    height: 5px;
+}
+
+/* Middle portion of scrollbar thumb */
+.ScrollbarThumbMiddle {
+    position: absolute;
+    background: url("ScrollbarThumbMiddle.png") repeat-y;
+    width: 7px;
+}
+
+/* Bottom portion of scrollbar thumb */
+.ScrollbarThumbBottom {
+    position: absolute;
+    background: url("ScrollbarThumbBottom.png") no-repeat;
+    width: 7px;
+    height: 5px;
+}
+
+
+/******************************************************************************/
+/* NotificationPopup */
+
+/* Container that defines the area for the popup dialog */
+.NotificationPopupContainer {
+    position: fixed;
+    bottom: 0px;
+    left: 50%;
+    margin-left: -115px;
+    width: 230px;
+    height: 85px;
+}
+
+/* Notification popup dialog */
+.NotificationPopup {
+    position: absolute;
+    width: 230px;
+    height: 85px;
+    background: url("NotificationPopupBackground.png") repeat-x;
+    border: 1px solid rgb(255,255,255);
+}
+
+/* Notification type indicator */
+.NotificationPopupTypeIndicator {
+    position: absolute;
+    left: 195px;
+    top: 10px;
+    width: 24px;
+    height: 34px;
+    background: url("NotificationPopupTypeIndicator.png") no-repeat;
+}
+
+/* Notification type indicator for notifications of undefined type */
+.NotificationPopupTypeIndicatorNone {
+    background-position: 0px 0px;
+}
+
+/* Notification type indicator for info notifications */
+.NotificationPopupTypeIndicatorInfo {
+    background-position: 0px -50px;
+}
+
+/* Notification type indicator for warning notifications */
+.NotificationPopupTypeIndicatorWarning {
+    background-position: 0px -100px;
+}
+
+/* Notification type indicator for wait notifications */
+.NotificationPopupTypeIndicatorWait {
+    background-position: 0px -150px;
+}
+
+/* Notification text area */
+.NotificationPopupText {
+    position: absolute;
+    left: 10px;
+    top: 8px;
+    width: 180px;
+    height: 50px;
+}
+
+/* Progress bar */
+.NotificationPopupProgressBar {
+    position: absolute;
+    left: 6px;
+    top: 60px;
+    width: 218px;
+    height: 16px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/ActionControl.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,144 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (ÒNokiaÓ) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under NokiaÕs copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The ActionControl class is an abstract base class for action controls like
+// buttons. Don't use ActionControl directly.
+
+// Constructor.
+function ActionControl(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// ActionControl inherits from Control.
+ActionControl.prototype = new Control(UI_NO_INIT_ID);
+
+// Reference to the button element.
+ActionControl.prototype.buttonElement = null;
+
+// Reference to the link element.
+ActionControl.prototype.linkElement = null;
+
+// Enabled status.
+ActionControl.prototype.enabled = false;
+
+// Initializer - called from constructor.
+ActionControl.prototype.init = function(id, caption) {
+    uiLogger.debug("ActionControl.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // the control defaults to enabled
+    this.enabled = true;
+}
+
+// Common event listeners hookup function called from subclasses.
+ActionControl.prototype.bindActionControlListeners = function() {
+    var self = this;
+    this.linkElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+    this.linkElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+    this.buttonElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+    this.buttonElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+    this.buttonElement.addEventListener("mousedown", function(event) {
+                                                       self.controlClicked(event);
+                                                       event.stopPropagation();
+                                                       event.preventDefault();
+                                                   }, true);
+    this.buttonElement.addEventListener("keydown", function(event) {
+                                                    // center and enter trigger the action
+                                                    if (event.keyCode == 0 || event.keyCode == 13) {
+                                                        self.controlClicked();
+                                                        event.stopPropagation();
+                                                        event.preventDefault();
+                                                    }
+                                                 }, true);
+}
+
+// Returns the enabled state.
+ActionControl.prototype.isEnabled = function() {
+    return this.enabled;
+}
+
+// Sets the enabled state.
+ActionControl.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("ActionControl.setEnabled(" + enabled + ")");
+    // switch the state
+    this.enabled = enabled;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+ActionControl.prototype.setFocused = function(focused) {
+    uiLogger.debug("ActionControl.setFocused(" + focused + ")");
+    if (this.enabled) {
+        if (focused) {
+            this.linkElement.focus();
+        } else {
+            this.linkElement.blur();
+        }
+    }
+}
+
+// Callback for clicks.
+ActionControl.prototype.controlClicked = function(event) {
+    uiLogger.debug("ActionControl.controlClicked()");
+    
+    // if we're enabled then a click results in an action performed event
+    if (this.enabled) {
+        // focus when clicked
+        if (!this.focused) {
+            this.linkElement.focus();
+        }
+        
+        // notify event listeners
+        this.actionPerformed(event);
+    }
+}
+
+// Callback for action performed events.
+ActionControl.prototype.actionPerformed = function(event) {
+    uiLogger.debug("ActionControl.actionPerformed()");
+    // notify event listeners
+    this.fireEvent(this.createEvent("ActionPerformed", event));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/Ajax.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,103 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// Ajax utility calss to create XmlHttpRequest object
+function Ajax() 
+{
+	//	xmlHttpRequest object	
+	var request = null;
+
+    // branch for native XMLHttpRequest object
+    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
+    	try 
+		{
+			request = new XMLHttpRequest();
+			try
+			{
+				//	attach the Bypass code, if the browser is firefox
+				if(netscape.security.PrivilegeManager.enablePrivilege)
+				{
+					//	duplicate the function
+					request._open = request.open;
+					
+					//	redefine the function definition
+					request.open = function(method, url, flag)
+					{
+						try
+						{
+							// Enable Universal Browser Read
+							netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
+
+							//	call the native XmlHttpRequest.open method
+							this._open(method, url, flag);
+						}catch(e)
+						{
+							//	call the native XmlHttpRequest.open method
+							this._open(method, url, flag);
+						}
+					}
+				}
+			}
+			catch(e)
+			{
+				//	eatup all exceptions
+			}
+		} 
+		catch(e) {
+			request = null;
+        }
+    // branch for IE/Windows ActiveX version
+    } else if(window.ActiveXObject) {
+       	try {
+        	request = new ActiveXObject("Msxml2.XMLHTTP");
+      	} catch(e) {
+        	try {
+          		request = new ActiveXObject("Microsoft.XMLHTTP");
+        	} catch(e) {
+          		alert('Failed to create XmlHttprequest');
+				return null;
+        	}
+		}
+    }
+	
+	return (request);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/ContentPanel.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,368 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The ContentPanel class is a control for displaying content. The panel
+// can be expanded and collapsed.
+
+// Constructor.
+function ContentPanel(id, caption, content, foldable, expanded) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, content, foldable, expanded);
+    }
+}
+
+// ContentPanel inherits from Control.
+ContentPanel.prototype = new Control(UI_NO_INIT_ID);
+
+// The element hierarchy in a content panel is as follows:
+//
+// rootElement
+//     assemblyElement
+//         captionElement
+//             foldToggleElement
+//                 captionLinkElement
+//                     captionTextElement
+//     contentElement
+//
+// captionTextElement is moved under foldToggleElement if disabled
+// or captionElement if not foldable
+
+// The fold toggle element used for folding content panels.
+ContentPanel.prototype.foldToggleElement = null;
+
+// The caption link element of this control.
+ContentPanel.prototype.captionLinkElement = null;
+
+// The caption text element of this control.
+ContentPanel.prototype.captionTextElement = null;
+
+// The content element of this control.
+ContentPanel.prototype.contentElement = null;
+
+// The foldable state of this control.
+ContentPanel.prototype.foldable = false;
+
+// The expanded state of this control.
+ContentPanel.prototype.expanded = false;
+
+// Enabled status.
+ContentPanel.prototype.enabled = false;
+
+// Initializer - called from constructor.
+ContentPanel.prototype.init = function(id, caption, content, foldable, expanded) {
+    uiLogger.debug("ContentPanel.init(" + id + ", " + caption + ", " + content + ", " + foldable + ", " + expanded + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // the control defaults to enabled
+    this.enabled = true;
+    
+    // create caption text element
+    this.captionTextElement = document.createElement("span");
+    
+    // disconnect the control element
+    this.assemblyElement.removeChild(this.controlElement);
+    
+    // set the foldable state
+    this.foldable = foldable;
+    
+    // is this a foldable content panel?
+    if (foldable) {
+        // create fold toggle element
+        this.foldToggleElement = document.createElement("div");
+        this.captionElement.appendChild(this.foldToggleElement);
+        
+        // create caption link and add to caption element
+        this.captionLinkElement = document.createElement("a");
+        this.captionLinkElement.href = "JavaScript:void(0)";
+        this.foldToggleElement.appendChild(this.captionLinkElement);
+        
+        // add the text element to the link element
+        this.captionLinkElement.appendChild(this.captionTextElement);
+        
+        // bind event listeners
+        var self = this;
+        this.captionLinkElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+        this.captionLinkElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+        this.foldToggleElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+        this.foldToggleElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+        this.foldToggleElement.addEventListener("mousedown", function(event) {
+                                                                 self.captionClicked();
+                                                                 event.stopPropagation();
+                                                                 event.preventDefault();
+                                                             }, true);
+        this.foldToggleElement.addEventListener("keydown", function(event) {
+                                                               // center and enter trigger the action
+                                                               if (event.keyCode == 0 || event.keyCode == 13) {
+                                                                   self.captionClicked();
+                                                                   event.stopPropagation();
+                                                                   event.preventDefault();
+                                                               }
+                                                           }, true);
+        
+        this.expanded = expanded;
+    } else {
+        // since this is not a foldable panel the content should be expanded
+        this.expanded = true;
+        
+        // add the text element directly to the caption element
+        this.captionElement.appendChild(this.captionTextElement);
+    }
+    
+    // create content element
+    this.contentElement = document.createElement("div");
+    this.contentElement.style.display = this.expanded ? "block" : "none";
+    this.rootElement.appendChild(this.contentElement);
+    
+    // set caption, content and expanded state
+    this.setCaption(caption);
+    this.setContent(content);
+    
+    // update style
+    this.updateStyleFromState();
+}
+
+// Returns the enabled state.
+ContentPanel.prototype.isEnabled = function() {
+    return this.enabled;
+}
+
+// Sets the enabled state.
+ContentPanel.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("ContentPanel.setEnabled(" + enabled + ")");
+    
+    // bail out early if there is no change in state
+    if (this.enabled == enabled) {
+        return;
+    }
+    
+    // set the enabled state
+    this.enabled = enabled;
+    
+    // is this a foldable content?
+    if (this.foldable) {
+         // the caption link must be disabled
+        if (this.enabled) {
+            // diabled -> enabled
+            this.foldToggleElement.removeChild(this.captionTextElement);
+            this.foldToggleElement.appendChild(this.captionLinkElement);
+            this.captionLinkElement.appendChild(this.captionTextElement);
+        } else {
+            // enabled -> diabled
+            this.captionLinkElement.removeChild(this.captionTextElement);
+            this.foldToggleElement.removeChild(this.captionLinkElement);
+            this.foldToggleElement.appendChild(this.captionTextElement);
+        }
+    }
+    
+    // update style
+    this.updateStyleFromState();    
+}
+
+// Returns the caption; null if none.
+ContentPanel.prototype.getCaption = function() {
+    return this.caption;
+}
+
+// Sets the caption; null if none.
+ContentPanel.prototype.setCaption = function(caption) {
+    // bail out if the caption text element has not been created
+    // this is to prevent the superclass init calling this before
+    // we've initialized our custom caption
+    if (this.captionTextElement == null)
+        return;
+    
+    uiLogger.debug("ContentPanel.setCaption(" + caption + ")");
+    
+    // set the display style
+    this.captionElement.style.display = (caption == null) ? "none" : "block";
+    
+    // set the caption
+    this.caption = caption;
+    this.captionTextElement.innerHTML = (caption == null) ? "" : caption;
+    
+    // update style
+    this.updateStyleFromState();
+}
+
+// Returns the content.
+ContentPanel.prototype.getContent = function() {
+    return this.contentElement.innerHTML;
+}
+
+// Sets the content.
+ContentPanel.prototype.setContent = function(content) {
+    uiLogger.debug("ContentPanel.setContent(" + content + ")");
+    this.contentElement.innerHTML = (content == null) ? "" : content;
+}
+
+// Returns the focusable state for the control.
+ContentPanel.prototype.isFocusable = function() {
+    // a content panel is focusable if it's foldable and enabled
+    return (this.foldable && this.enabled);
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+ContentPanel.prototype.setFocused = function(focused) {
+    uiLogger.debug("ContentPanel.setFocused(" + focused + ")");
+    if (this.enabled && this.foldable) {
+        if (focused) {
+            this.captionLinkElement.focus();
+        } else {
+            this.captionLinkElement.blur();
+        }
+    }
+    // note that this.focused gets set as a result of focusStateChanged() being called
+    // rather than setting it explicitly here
+}
+
+// Returns the expanded state.
+ContentPanel.prototype.isExpanded = function() {
+    return this.expanded;
+}
+
+// Sets the expanded state.
+ContentPanel.prototype.setExpanded = function(expanded) {
+    uiLogger.debug("ContentPanel.setExpanded(" + expanded + ")");
+    
+    // make sure only foldable content panels are folded
+    if (!this.foldable) {
+        uiLogger.warn("Cannot fold a non-foldable content panel!");
+        return;
+    }
+    
+    this.expanded = expanded;
+    if (this.expanded) {
+        // expand
+        this.contentElement.style.display = "block";
+        
+        // find out control top and bottom
+        var controlTop = this.getAbsoluteTop(this.rootElement);
+        var controlHeight = this.rootElement.clientHeight;
+        var controlBottom = controlTop + controlHeight;
+        
+        // find out the viewport top and bottom
+        var viewportTop = window.scrollY;
+        var viewportHeight = window.innerHeight;
+        var viewportBottom = viewportTop + viewportHeight;
+        
+        // make sure the control is positioned so that it can be seen
+        var overflow = controlBottom - viewportBottom;
+        if (overflow > 0) {
+            // there's overflow so we need to scroll to get the control
+            // into the viewport - however not so far that the control
+            // goes past the viewport top.
+            var distanceToTop = controlTop - viewportTop;
+            var scrollAmount = Math.min(overflow, distanceToTop);
+            window.scrollBy(0, scrollAmount);
+        }
+    } else {
+        // collapse
+        this.contentElement.style.display = "none";
+    }
+    
+    // notify event listeners
+    this.fireEvent(this.createEvent("ExpandedStateChanged", this.expanded));
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the absolute position (y) of the given element.
+ContentPanel.prototype.getAbsoluteTop = function(element) {
+    // traverse from element to root and add top-offset
+    // for each element we find on the way
+    var absTop = 0;
+    while (element != null) {
+        absTop += element.offsetTop;
+        element = element.offsetParent;
+    }
+    return absTop;
+}
+
+// Callback for when the caption is clicked.
+ContentPanel.prototype.captionClicked = function() {
+    uiLogger.debug("ContentPanel.captionClicked()");
+    
+    // if we're enabled then a click results toggling the expanded state
+    if (this.enabled) {
+        // focus when clicked
+        if (!this.focused) {
+            this.captionLinkElement.focus();
+        }
+        
+        // toggle the expanded state
+        this.setExpanded(!this.expanded);
+    }
+}
+
+// Updates the style of the control to reflects the state of the control.
+ContentPanel.prototype.updateStyleFromState = function() {
+    uiLogger.debug("ContentPanel.updateStyleFromState()");
+
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set root element class name
+    this.setClassName(this.rootElement, "Control");
+
+    // set the control assembly class names
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    
+    if (this.foldable) {
+        // foldable content panel
+        this.setClassName(this.captionElement, "ContentPanelCaptionFoldable");
+        this.setClassName(this.foldToggleElement, "ContentPanelFoldToggle ContentPanelFoldToggle" + (this.expanded ? "Expanded" : "Collapsed"));
+    } else {
+        // non-folding
+        this.setClassName(this.captionElement, "ContentPanelCaptionNonFoldable");
+    }
+    
+    // set the content caption text class names
+    this.setClassName(this.captionTextElement, "ContentPanelCaptionText ContentPanelCaptionText" + stateName);
+    
+    // set the content element class names
+    this.setClassName(this.contentElement, "ContentPanelContent");
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/Control.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,231 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Control class is an abstract base class for all user interface controls.
+
+// Constructor.
+function Control(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// Control inherits from UIElement.
+Control.prototype = new UIElement(UI_NO_INIT_ID);
+
+// The view that control belongs to.
+Control.prototype.view = null;
+
+// Is the control focused?
+Control.prototype.focused = false;
+
+// Is the pointer over this control?
+Control.prototype.hovering = false;
+
+// The element hierarchy in a control is as follows:
+//
+// rootElement
+//     assemblyElement
+//         captionElement
+//         controlElement
+//
+// The assembly element groups the portion of a control that typically handle
+// the visual effects for focus and hover states. Having a separate root and
+// assembly elements allows other elements to be added to a control without
+// them being affected by the CSS rules of the assembly element.
+
+// The assembly element of this control.
+Control.prototype.assemblyElement = null;
+
+// The caption of this control; null if none.
+Control.prototype.caption = null;
+
+// The caption element of this control.
+Control.prototype.captionElement = null;
+
+// The control element of this control.
+Control.prototype.controlElement = null;
+
+// Initializer - called from constructor.
+Control.prototype.init = function(id, caption) {
+    uiLogger.debug("Control.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    UIElement.prototype.init.call(this, id);
+    
+    // create assembly, caption and control elements
+    this.assemblyElement = document.createElement("div");
+    this.captionElement = document.createElement("div");
+    this.assemblyElement.appendChild(this.captionElement);
+    this.controlElement = document.createElement("div");
+    this.assemblyElement.appendChild(this.controlElement);
+    this.rootElement.appendChild(this.assemblyElement);
+    
+    // set the caption
+    // style is not updated because the subclass will update the style later
+    // when it has completely initialized the component
+    this.setCaption(caption, true);
+}
+
+// Returns the caption; null if none.
+Control.prototype.getCaption = function() {
+    return this.caption;
+}
+
+// Sets the caption; null if none.
+Control.prototype.setCaption = function(caption, noStyleUpdate) {
+    uiLogger.debug("Control.setCaption(" + caption + ")");
+    
+    // set the display style
+    this.captionElement.style.display = (caption == null) ? "none" : "block";
+    
+    // set the caption
+    this.caption = caption;
+    this.captionElement.innerHTML = (caption == null) ? "" : caption;
+    
+    // update style
+    if (!noStyleUpdate) {
+        this.updateStyleFromState();
+    }
+}
+
+// Returns the enabled state.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.isEnabled = function() {
+    return false;
+}
+
+// Sets the enabled state.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("Control.setEnabled(" + enabled + ")");
+}
+
+// Returns the focusable state for the control.
+// Defaults focusable if enabled - override this in subclasses as required.
+Control.prototype.isFocusable = function() {
+    return this.isEnabled();
+}
+
+// Returns the focused state for the control.
+Control.prototype.isFocused = function() {
+    return this.focused;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.setFocused = function(focused) {
+    uiLogger.debug("Control.setFocused(" + focused + ")");
+    // note that this.focused gets set as a result of focusStateChanged() being called
+    // rather than setting it explicitly here
+}
+
+// Called when the focus state has changed for this control.
+Control.prototype.focusStateChanged = function(focused) {
+    uiLogger.debug("Control.focusStateChanged(" + focused + ")");
+    if (this.focused != focused) {
+        this.focused = focused;
+        
+        // let the view know about the focus change
+        if (this.view != null) {
+            this.view.focusedControlChanged(focused ? this : null);
+        }
+        
+        // update the style from the current state
+        this.updateStyleFromState();
+        
+        // notify event listeners
+        this.fireEvent(this.createEvent("FocusStateChanged", focused));
+    }
+}
+
+// Called when the hover state has changed for this control.
+Control.prototype.hoverStateChanged = function(hovering) {
+    uiLogger.debug("Control.hoverStateChanged(" + hovering + ")");
+    if (this.hovering != hovering) {
+        this.hovering = hovering;
+        
+        // update the style from the current state
+        this.updateStyleFromState();
+        
+        // notify event listeners
+        this.fireEvent(this.createEvent("HoverStateChanged", hovering));
+    }
+}
+
+// Helper method that returns the state name for the current state.
+Control.prototype.getStyleStateName = function() {
+    var focusable = this.isFocusable();
+    if (focusable && this.focused) {
+        return "Focus";
+    } else if (focusable && this.hovering) {
+        return "Hover";
+    } else if (!this.isEnabled()) {
+        return "Disabled";
+    } else {
+        return "Normal";
+    }
+}
+
+// Resets the state tracking for focus and hover.
+// Override this in subclasses as required to implement the state reset.
+Control.prototype.resetFocusState = function() {
+    uiLogger.debug("Control.resetFocusState()");
+    this.hovering = false;
+    this.focused = false;
+    this.updateStyleFromState();
+}
+
+// Helper function that sets a classname for an element.
+// Only sets the class name if it actually is different from the current value.
+Control.prototype.setClassName = function(element, className) {
+    if (element.className != className) {
+        element.className = className;
+    }
+}
+
+// Updates the style of the control to reflects the state of the control.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Control.updateStyleFromState()");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/FormButton.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,177 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The FormButton class implements a button control for use in form-style UIs.
+
+// Constructor.
+function FormButton(id, text) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, text);
+    }
+}
+
+// FormButton inherits from ActionControl.
+FormButton.prototype = new ActionControl(UI_NO_INIT_ID);
+
+// Button table element.
+FormButton.prototype.tableElement = null;
+
+// Button table row element.
+FormButton.prototype.tableRowElement = null;
+
+// Button table left cell element.
+FormButton.prototype.tableLeftCellElement = null;
+
+// Button table center cell element.
+FormButton.prototype.tableCenterCellElement = null;
+
+// Button text element.
+FormButton.prototype.textElement = null;
+
+// Button table right cell element.
+FormButton.prototype.tableRightCellElement = null;
+
+// Initializer - called from constructor.
+FormButton.prototype.init = function(id, text) {
+    uiLogger.debug("FormButton.init(" + id + ", " + text + ")");
+    
+    // call superclass initializer
+    ActionControl.prototype.init.call(this, id, null);
+    
+    // remove caption element
+    this.assemblyElement.removeChild(this.captionElement);
+    
+    // construct the button
+    this.buttonElement = document.createElement("div");
+    this.tableElement = document.createElement("table");
+    this.tableRowElement = document.createElement("tr");
+    this.tableLeftCellElement = document.createElement("td");
+    this.tableCenterCellElement = document.createElement("td");
+    this.linkElement = document.createElement("a");
+    this.linkElement.href = "JavaScript:void(0)";
+    this.textElement = document.createElement("span");
+    this.tableRightCellElement = document.createElement("td");
+    this.tableElement.appendChild(this.tableRowElement);
+    this.tableRowElement.appendChild(this.tableLeftCellElement);
+    this.tableRowElement.appendChild(this.tableCenterCellElement);
+    this.tableCenterCellElement.appendChild(this.linkElement);
+    this.linkElement.appendChild(this.textElement);
+    this.tableRowElement.appendChild(this.tableRightCellElement);
+    this.buttonElement.appendChild(this.tableElement);
+    this.controlElement.appendChild(this.buttonElement);
+    
+    // set the text
+    this.setText(text);
+    
+    // bind event listeners
+    this.bindActionControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Sets the enabled state.
+FormButton.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("FormButton.setEnabled(" + enabled + ")");
+    
+    // bail out early if there is no change in state
+    if (this.enabled == enabled) {
+        return;
+    }
+    
+    // set the enabled state
+    this.enabled = enabled;
+    
+    if (this.enabled) {
+        // diabled -> enabled
+        this.tableCenterCellElement.removeChild(this.textElement);
+        this.tableCenterCellElement.appendChild(this.linkElement);
+        this.linkElement.appendChild(this.textElement);
+    } else {
+        // enabled -> diabled
+        this.linkElement.removeChild(this.textElement);
+        this.tableCenterCellElement.removeChild(this.linkElement);
+        this.tableCenterCellElement.appendChild(this.textElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the button text.
+FormButton.prototype.getText = function() {
+    return this.textElement.innerHTML;
+}
+
+// Sets the button text.
+FormButton.prototype.setText = function(text) {
+    uiLogger.debug("FormButton.setText(" + text + ")");
+    this.textElement.innerHTML = (text == null) ? "" : text;;
+}
+
+// Updates the style of the control to reflects the state of the control.
+FormButton.prototype.updateStyleFromState = function() {
+    uiLogger.debug("FormButton.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set root element class name
+    this.setClassName(this.rootElement, "Control");
+    
+    // set the control assembly class names
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    
+    // control element
+    this.setClassName(this.controlElement, "ControlElement FormButtonControlElement");
+    
+    // set the button table class names
+    this.setClassName(this.buttonElement, "FormButton");
+    this.setClassName(this.tableElement, "FormButtonTable");
+    this.setClassName(this.tableRowElement, "FormButtonRow");
+    this.setClassName(this.tableLeftCellElement, "FormButtonLeftCell FormButtonLeftCell" + stateName);
+    this.setClassName(this.tableCenterCellElement, "FormButtonCenterCell FormButtonLeftCell" + stateName);
+    this.setClassName(this.tableRightCellElement, "FormButtonRightCell FormButtonLeftCell" + stateName);
+    
+    // set the button text class name
+    this.setClassName(this.textElement, "FormButtonText FormButtonText" + stateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/ImageLabel.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,94 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// The ImageLabel class implements a control that displays an image
+
+// Constructor.
+function ImageLabel(id, caption, image) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, image);
+    }
+}
+
+// Label inherits from Control.
+ImageLabel.prototype = new Control(UI_NO_INIT_ID);
+
+// Content element for the ImageLabel
+ImageLabel.prototype.contentElement = null;
+
+// DOM element for image 
+ImageLabel.prototype.image = null;
+
+// DOM element for text 
+ImageLabel.prototype.text = null;
+
+// Initializer - called from constructor.
+ImageLabel.prototype.init = function(id, caption, image) {
+    uiLogger.debug("ImageLabel.init(" + id + ", " + caption + ", " + image + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, null);
+    
+    // create content element
+    this.contentElement = document.createElement("div");
+    this.controlElement.appendChild(this.contentElement);
+    
+	this.image = image;
+	this.label = caption;
+	this.updateContentElement();
+}
+
+// Returns the enabled state for the control.
+ImageLabel.prototype.isEnabled = function() {
+    return true;
+}
+
+// Returns the focusable state for the control.
+ImageLabel.prototype.isFocusable = function() {
+    return false;
+}
+
+// Returns the button image (URL); null if none.
+ImageLabel.prototype.getImage = function() {
+    return image;
+}
+
+// Sets the button image (URL); null if none.
+ImageLabel.prototype.setImage = function(image) {
+	this.image = image;
+}
+
+// Sets the text
+ImageLabel.prototype.setLabel = function(text) {
+	this.label = label;
+}
+
+ImageLabel.prototype.updateContentElement = function(){
+	var buf = "";
+	if ( this.image != null ) {
+		buf += "<img src=" + this.image+" ALIGN=MIDDLE>";
+	}
+	if (this.label != null ) {
+		buf += this.label;
+	}
+	this.contentElement.innerHTML = buf;
+}
+
+// Updates the style of the control to reflects the state of the control.
+ImageLabel.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Label.updateStyleFromState()");
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    this.setClassName(this.captionElement, "ControlCaption ControlCaptionNormal");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.contentElement, "ContentPanelCaptionText");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/Label.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,105 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Label class implements a control that displays textual content.
+
+// Constructor.
+function Label(id, caption, text) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, text);
+    }
+}
+
+// Label inherits from Control.
+Label.prototype = new Control(UI_NO_INIT_ID);
+
+// Content element for label text.
+Label.prototype.contentElement = null;
+
+// Initializer - called from constructor.
+Label.prototype.init = function(id, caption, text) {
+    uiLogger.debug("Label.init(" + id + ", " + caption + ", " + text + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // create content element
+    this.contentElement = document.createElement("div");
+    this.controlElement.appendChild(this.contentElement);
+    
+    // set the text
+    this.setText(text);
+}
+
+// Returns the enabled state for the control.
+Label.prototype.isEnabled = function() {
+    return true;
+}
+
+// Returns the focusable state for the control.
+Label.prototype.isFocusable = function() {
+    return false;
+}
+
+// Returns the control text.
+Label.prototype.getText = function() {
+    return this.contentElement.innerHTML;
+}
+
+// Sets the text for the control.
+Label.prototype.setText = function(text) {
+    uiLogger.debug("Label.setText(" + text + ")");
+    this.contentElement.innerHTML = (text == null) ? "" : text;
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+Label.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Label.updateStyleFromState()");
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    this.setClassName(this.captionElement, "ControlCaption ControlCaptionNormal");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.contentElement, "LabelText");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/ListView.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,186 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The ListView class implements a vertical list view that hosts controls
+// as child components.
+
+// Constructor.
+function ListView(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// ListView inherits from View.
+ListView.prototype = new View(UI_NO_INIT_ID);
+
+// The caption of this view; null if none.
+ListView.prototype.caption = null;
+
+// The caption element of this view.
+ListView.prototype.captionElement = null;
+
+// The caption text element of this view.
+ListView.prototype.captionTextElement = null;
+
+// Root HTML element for controls.
+ListView.prototype.listElement = null;
+
+// List of controls in the view.
+ListView.prototype.controls = null;
+
+// Initializer for ListView.
+ListView.prototype.init = function(id, caption) {
+    uiLogger.debug("ListView.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    View.prototype.init.call(this, id);
+    
+    // init control array
+    this.controls = [];
+    
+    // set style class name for root element
+    this.rootElement.className = "ListView";
+    
+    // create caption and caption text elements
+    this.captionElement = document.createElement("div");
+    this.captionElement.className = "ListViewCaptionText";
+    this.rootElement.appendChild(this.captionElement);
+    
+    // create root element for controls and add to the view root element
+    this.listElement = document.createElement("div");
+    this.listElement.className = "ListViewControlList";
+    this.rootElement.appendChild(this.listElement);
+    
+    // set the caption
+    this.setCaption(caption);
+}
+
+// Returns the caption; null if none.
+ListView.prototype.getCaption = function() {
+    return this.caption;
+}
+
+// Sets the caption; null if none.
+ListView.prototype.setCaption = function(caption) {
+    uiLogger.debug("ListView.setCaption(" + caption + ")");
+    
+    // set the display style
+    this.captionElement.style.display = (caption == null) ? "none" : "block";
+    
+    // set the caption
+    this.caption = caption;
+    this.captionElement.innerHTML = (caption == null) ? "" : caption;
+}
+
+// Returns an array of controls in the view.
+ListView.prototype.getControls = function() {
+    return this.controls;
+}
+
+// Adds a control to the view.
+ListView.prototype.addControl = function(control) {
+    uiLogger.debug("ListView.addControl(" + control + ")");
+    
+    // add the control to the controls array and attach it to the list element
+    this.controls.push(control);
+    this.listElement.appendChild(control.rootElement);
+    control.view = this;
+}
+
+// Inserts a control to the view before the specified control.
+ListView.prototype.insertControl = function(control, beforeControl) {
+    uiLogger.debug("ListView.insertControl(" + control + ", " + beforeControl + ")");
+    
+    // iterate through current controls
+    for (var i = 0; i < this.controls.length; i++) {
+        // is this the control we should insert before?
+        if (this.controls[i] == beforeControl) {
+            // we found the control to insert before - insert here and connect to list element
+            this.controls.splice(i, 0, control);
+            this.listElement.insertBefore(control.rootElement, beforeControl.rootElement);
+            control.view = this;
+            return;
+        }
+    }
+    
+    // the control wasn't found so we'll add it last
+    this.addControl(control);
+}
+
+// Removes a control from the view.
+ListView.prototype.removeControl = function(control) {
+    uiLogger.debug("ListView.removeControl(" + control + ")");
+    
+    // iterate through current controls
+    for (var i = 0; i < this.controls.length; i++) {
+        // is this the control we should remove?
+        if (this.controls[i] == control) {
+            // we found the control to remove - remove it from the list element
+            this.controls.splice(i, 1);
+            this.listElement.removeChild(control.rootElement);
+            control.view = null;
+        }
+    }
+}
+
+// Attempts to focus the first focusable control.
+ListView.prototype.focusFirstControl = function() {
+    uiLogger.debug("ListView.focusFirstControl()");
+    for (var i = 0; i < this.controls.length; i++) {
+        // is this control focusable?
+        var control = this.controls[i];
+        if (control.isFocusable()) {
+            control.setFocused(true);
+            break;
+        }
+    }
+}
+
+// Attempts to reset all control focus states.
+// Override in subclasses as required.
+ListView.prototype.resetControlFocusStates = function() {
+    uiLogger.debug("ListView.resetControlFocusStates()");
+    for (var i = 0; i < this.controls.length; i++) {
+        this.controls[i].resetFocusState();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/NavigationButton.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,220 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The NavigationButton class implements a button control for use in
+// navigational contexts in menu-style UIs.
+
+// Constructor.
+function NavigationButton(id, image, text) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, image, text);
+    }
+}
+
+// NavigationButton inherits from ActionControl.
+NavigationButton.prototype = new ActionControl(UI_NO_INIT_ID);
+
+// Button table element.
+NavigationButton.prototype.tableElement = null;
+
+// Button table row element.
+NavigationButton.prototype.tableRowElement = null;
+
+// Button table left cell element.
+NavigationButton.prototype.tableLeftCellElement = null;
+
+// Button table right cell element.
+NavigationButton.prototype.tableRightCellElement = null;
+
+// Button image element.
+NavigationButton.prototype.imageElement = null;
+
+// Button link element.
+NavigationButton.prototype.linkElement = null;
+
+// Button text element.
+NavigationButton.prototype.textElement = null;
+
+// Initializer - called from constructor.
+NavigationButton.prototype.init = function(id, image, text) {
+    uiLogger.debug("NavigationButton.init(" + id + ", " + image + ", " + text + ")");
+    
+    // call superclass initializer
+    ActionControl.prototype.init.call(this, id, null);
+    
+    // remove caption element
+    this.assemblyElement.removeChild(this.captionElement);
+    
+    // construct the button
+    this.buttonElement = document.createElement("div");
+    this.tableElement = document.createElement("table");
+    this.tableRowElement = document.createElement("tr");
+    this.tableLeftCellElement = document.createElement("td");
+    this.tableRightCellElement = document.createElement("td");
+    this.imageElement = null;
+    this.linkElement = document.createElement("a");
+    this.linkElement.href = "JavaScript:void(0)";
+    this.textElement = document.createElement("span");
+    this.tableElement.appendChild(this.tableRowElement);
+    this.tableRowElement.appendChild(this.tableLeftCellElement);
+    this.tableRowElement.appendChild(this.tableRightCellElement);
+    this.tableRightCellElement.appendChild(this.linkElement);
+    this.linkElement.appendChild(this.textElement);
+    this.buttonElement.appendChild(this.tableElement);
+    this.controlElement.appendChild(this.buttonElement);
+    
+    // set the image and text
+    this.setImage(image);
+    this.setText(text);
+    
+    // bind event listeners
+    this.bindActionControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Sets the enabled state.
+NavigationButton.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("NavigationButton.setEnabled(" + enabled + ")");
+    
+    // bail out early if there is no change in state
+    if (this.enabled == enabled) {
+        return;
+    }
+    
+    // set the enabled state
+    this.enabled = enabled;
+    
+    if (this.enabled) {
+        // diabled -> enabled
+        this.tableRightCellElement.removeChild(this.textElement);
+        this.tableRightCellElement.appendChild(this.linkElement);
+        this.linkElement.appendChild(this.textElement);
+    } else {
+        // enabled -> diabled
+        this.linkElement.removeChild(this.textElement);
+        this.tableRightCellElement.removeChild(this.linkElement);
+        this.tableRightCellElement.appendChild(this.textElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the button image (URL); null if none.
+NavigationButton.prototype.getImage = function() {
+    return (this.imageElement != null) ? this.imageElement.src : null;
+}
+
+// Sets the button image (URL); null if none.
+NavigationButton.prototype.setImage = function(image) {
+    uiLogger.debug("NavigationButton.setImage(" + image + ")");
+    
+    if (image == null) {
+        // remove image - if any
+        if (this.imageElement != null) {
+            this.tableLeftCellElement.removeChild(this.imageElement);
+        }
+    } else {
+        // default to not append image element
+        var append = false;
+        
+        // create image element if one doesn't exist
+        if (this.imageElement == null) {
+            this.imageElement = document.createElement("img");
+            this.imageElement.setAttribute("alt", "");
+            append = true;
+        }
+        
+        // set image source URL
+        this.imageElement.src = image;
+        
+        // append the image element to the left cell?
+        if (append) {
+            this.tableLeftCellElement.appendChild(this.imageElement);
+        }
+    }
+}
+
+// Returns the button text.
+NavigationButton.prototype.getText = function() {
+    return this.textElement.innerHTML;
+}
+
+// Sets the button text.
+NavigationButton.prototype.setText = function(text) {
+    uiLogger.debug("NavigationButton.setText(" + text + ")");
+    this.textElement.innerHTML = (text == null) ? "" : text;;
+}
+
+// Updates the style of the control to reflects the state of the control.
+NavigationButton.prototype.updateStyleFromState = function() {
+    uiLogger.debug("NavigationButton.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set root element class name
+    this.setClassName(this.rootElement, "Control");
+    
+    // set the control assembly class names
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    
+    // control element
+    this.setClassName(this.controlElement, "ControlElement NavigationButtonControlElement");
+    
+    // set the button table class names
+    this.setClassName(this.buttonElement, "NavigationButton");
+    this.setClassName(this.tableElement, "NavigationButtonTable");
+    this.setClassName(this.tableRowElement, "NavigationButtonRow");
+    this.setClassName(this.tableLeftCellElement, "NavigationButtonImageCell");
+    this.setClassName(this.tableRightCellElement, "NavigationButtonTextCell");
+    
+    // set image class names
+    if (this.imageElement) {
+        this.setClassName(this.imageElement, "NavigationButtonImage");
+    }
+    
+    // set the button text class name
+    this.setClassName(this.textElement, "NavigationButtonText NavigationButtonText" + stateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/NotificationPopup.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,321 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The NotificationPopup class handles the display of notifications such as
+// warnings, information messages and progress indication.
+
+// Constructor.
+function NotificationPopup() {
+    // create notification popup
+    this.containerElement = document.createElement("div");
+    this.containerElement.className = "NotificationPopupContainer";
+    this.popupElement = document.createElement("div");
+    this.popupElement.className = "NotificationPopup";
+    this.typeIndicatorElement = document.createElement("div");
+    this.typeIndicatorElement.className = "NotificationPopupTypeIndicator";
+    this.textElement = document.createElement("div");
+    this.textElement.className = "NotificationPopupText";
+    this.progressBarElement = document.createElement("div");
+    this.progressBarElement.className = "NotificationPopupProgressBar";
+    
+    // assemble popup
+    this.popupElement.appendChild(this.typeIndicatorElement);
+    this.popupElement.appendChild(this.textElement);
+    this.popupElement.appendChild(this.progressBarElement);
+    this.containerElement.appendChild(this.popupElement);
+    
+    // create progress bar image element and initialize it
+    this.progressBarImageElement = document.createElement("img");
+    var self = this;
+    this.progressBarImageElement.addEventListener("load", function() { self.progressBarImageLoadingCompleted(); }, false);
+    this.progressBarImageElement.setAttribute("alt", "");
+    this.progressBarImageURL = this.getProgressBarImage(this.PROGRESS_BAR_IMAGE_NONE);
+    this.progressBarImageElement.src = this.progressBarImageURL;
+    this.progressBarElement.appendChild(this.progressBarImageElement);
+    
+    // init the popup to be fully down
+    this.popupElement.style.top = "100%";
+    
+    // set default popup contents
+    this.setPopupContents(null, null, null);
+}
+
+// Notification container element.
+NotificationPopup.prototype.containerElement = null;
+
+// Notification popup element.
+NotificationPopup.prototype.popupElement = null;
+
+// Type indicator element.
+NotificationPopup.prototype.typeIndicatorElement = null;
+
+// Notification text element.
+NotificationPopup.prototype.textElement = null;
+
+// Progress bar element.
+NotificationPopup.prototype.progressBarElement = null;
+
+// Progress bar image element.
+NotificationPopup.prototype.progressBarImageElement = null;
+
+// Progress bar image URL.
+NotificationPopup.prototype.progressBarImageURL = null;
+
+// Has the progress bar image been loaded?
+NotificationPopup.prototype.progressBarImageLoaded = false;
+
+// Flag that tracks whether we're in the middle of starting to
+// show a notification popup.
+NotificationPopup.prototype.processingShowNotification = false;
+
+// Notification popup position (0 = hidden, 1 = showing).
+NotificationPopup.prototype.popupPosition = 0;
+
+// Interval for timer ticks (in milliseconds)
+NotificationPopup.prototype.ANIM_TIMER_INTERVAL = 25;
+
+// Animation timer identifier or null if no active timer.
+NotificationPopup.prototype.animTimerId = null;
+
+// Time in milliseconds for the popup animation to complete
+NotificationPopup.prototype.ANIM_TIME = 300;
+
+// Flag that determines the behavior of showNotification(). If set to true
+// the popup will snap open when showNotification() is called instead of
+// animation.
+NotificationPopup.prototype.SHOW_SNAPS_OPEN = true;
+
+// Animation direction (0 = no movement, -1 hiding, +1 = showing).
+NotificationPopup.prototype.animDir = 0;
+
+// Auto-hide timer identifier or null if no active timer.
+NotificationPopup.prototype.autoHideTimerId = null;
+
+// The commanded display time.
+NotificationPopup.prototype.displayTime = -1;
+
+NotificationPopup.prototype.PROGRESS_BAR_IMAGE_NONE = 0;
+
+// Displays a notification.
+NotificationPopup.prototype.showNotification = function(displayTime, type, text, progress) {
+    uiLogger.debug("NotificationPopup.showNotification(" + displayTime + ", " + type + ", " + text + ", " + progress + ")");
+    
+    // mark that showNotification() has been called and that we are in
+    // the middle of starting to show the notification popup
+    this.processingShowNotification = true;
+    
+    // remember the display time
+    this.displayTime = displayTime;
+    
+    // attach the popup to the document if not attached
+    if (this.containerElement.parentNode == null) {
+        document.body.appendChild(this.containerElement);
+        uiLogger.debug("Notification popup attached to document");
+    }
+    
+    // set popup contents and update style
+    this.setPopupContents(type, text, progress);
+    
+    // if the progress image is loaded then we can complete the showing
+    // of the notification popup immediately - otherwise the image loaded
+    // allback will complete the process.
+    if (this.progressBarImageLoaded) {
+        this.completeShowNotification();
+    }
+}
+
+// Completes displaying of a notification.
+// Note: Used internally - don't call this directly.
+NotificationPopup.prototype.completeShowNotification = function() {
+    uiLogger.debug("NotificationPopup.completeShowNotification()");
+    
+    // animation direction is +1 for showing the popup
+    if (this.popupPosition != 1) {
+        if (this.SHOW_SNAPS_OPEN) {
+            if (this.popupPosition == 0) {
+                this.popupPosition = 1;
+            }
+        }
+        this.animatePopup(1);
+    }
+    
+    // setup auto hiding if a display time is specified
+    if (this.displayTime > 0) {
+        // stop any existing timer
+        if (this.autoHideTimerId != null) {
+            clearTimeout(this.autoHideTimerId);
+            uiLogger.debug("Auto hide timer stopped");
+        }
+        // set timer to hide notification
+        var self = this;
+        this.autoHideTimerId = setTimeout(function() {
+                                              if (self.displayTime > 0) {
+                                                  self.hideNotification();
+                                              }
+                                          }, this.ANIM_TIME + this.displayTime);
+        uiLogger.debug("Auto hide timer started");
+    }
+    
+    // mark us as no longer processing a show notification call
+    this.processingShowNotification = false;
+}
+
+// Hides the currently displayed notification.
+NotificationPopup.prototype.hideNotification = function() {
+    uiLogger.debug("NotificationPopup.hideNotification()");
+    // mark us as no longer processing a show notification call
+    this.processingShowNotification = false;
+    
+    // animation direction is -1 for hiding the popup
+    if (this.popupPosition != 0) {
+        this.animatePopup(-1);
+    }
+    
+    // stop auto hide timer if one is set
+    if (this.autoHideTimerId != null) {
+        clearTimeout(this.autoHideTimerId);
+        this.autoHideTimerId = null;
+        uiLogger.debug("Auto hide timer stopped");
+    }
+}
+
+// Starts animation of the popup (1 to show, -1 to hide).
+NotificationPopup.prototype.animatePopup = function(direction) {
+    uiLogger.debug("NotificationPopup.animatePopup(" + direction + ")");
+    // set the direction and star the animation timer
+    this.animDir = direction;
+    if (this.animTimerId == null) {
+        var self = this;
+        this.animTimerId = setInterval(function() { self.animate(); }, this.ANIM_TIMER_INTERVAL);
+        uiLogger.debug("Notification popup animation started");
+    }
+}
+
+// Callback for animation timer.
+NotificationPopup.prototype.animate = function() {
+    // calculate new popup position and clamp
+    var animStep = (this.ANIM_TIMER_INTERVAL / this.ANIM_TIME) * this.animDir;
+    var newPos = this.popupPosition + animStep;
+    if (newPos < 0) {
+        newPos = 0;
+    } else if (newPos > 1) {
+        newPos = 1;
+    }
+    
+    // set the new position to the popup element
+    this.popupPosition = newPos;
+    this.popupElement.style.top = (100 - Math.round(this.popupPosition * 100)) + "%";
+    
+    // have we reached the end of the animation?
+    if (newPos == 0 || newPos == 1) {
+        // reset animation direction
+        this.animDir = 0;
+        
+        // remove the popup from the body if its hidden
+        if (newPos == 0) {
+            document.body.removeChild(this.containerElement);
+            uiLogger.debug("Notification popup detached from document");
+        }
+        
+        // stop timer
+        clearTimeout(this.animTimerId);
+        this.animTimerId = null;
+        uiLogger.debug("Notification popup animation stopped");
+    }
+}
+
+// Returns a URL for the progress bar image to use for the specified progress.
+NotificationPopup.prototype.getProgressBarImage = function(progress) {
+    // path for progress bar images
+    var progressBarImagePath = "WRTKit/Resources/";
+    
+    // unknown progress
+    return progressBarImagePath + "ProgressBarUnknown.gif";
+}
+
+// Sets the contents of the popup.
+NotificationPopup.prototype.setPopupContents = function(type, text, progress) {
+    uiLogger.debug("NotificationPopup.setPopupContents(" + type + ", " + text + ", " + progress + ")");
+    
+    // figure out notification type style name
+    var typeName = (type == null) ? "none" : type.toLowerCase();
+    typeName = typeName.charAt(0).toUpperCase() + typeName.substring(1);
+    
+    // set type element class names
+    this.typeIndicatorElement.className = "NotificationPopupTypeIndicator NotificationPopupTypeIndicator" + typeName;
+    
+    // set notification text
+    this.textElement.innerHTML = (text == null) ? "" : text;
+    
+    // set progress
+    this.progressBarElement.style.display = (progress == null) ? "none" : "block";
+    if (progress != null) {
+        var imgURL = this.getProgressBarImage(progress);
+        if (imgURL != this.progressBarImageURL) {
+            // load new image
+            this.progressBarImageLoaded = false;
+            this.progressBarImageURL = imgURL;
+            this.progressBarImageElement.src = imgURL;
+        } else {
+            // the correct image is already loaded
+            this.progressBarImageLoaded = true;
+        }
+    } else {
+        // there is no progress bar so there is no need
+        // to load any progress bar image
+        this.progressBarImageLoaded = true;
+    }
+}
+
+// Callback for notifying the object that its progress bar image completed loading.
+NotificationPopup.prototype.progressBarImageLoadingCompleted = function() {
+    uiLogger.debug("NotificationPopup.progressBarImageLoadingCompleted()");
+    
+    // mark the progress bar image as loaded
+    this.progressBarImageLoaded = true;
+    
+    // complete the process of displaying the notification popup
+    // if it has been commanded but not yet completed
+    if (this.processingShowNotification) {
+        this.completeShowNotification();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/OsconContentPanel.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,16 @@
+
+
+///////////////////////////////////////////////////////////////////////////////
+// The OsconContentPanel class is a control for displaying content. 
+// The panel has a title bar and 
+// can be expanded and collapsed.
+
+// Constructor.
+function OsconContentPanel(id, caption, content, foldable, expanded) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, content, foldable, expanded);
+    }
+}
+
+// ContentPanel inherits from Control.
+ContentPanel.prototype = new Control(UI_NO_INIT_ID);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/Scrollbar.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,173 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Scrollbar class is an implementation of a user interface element that
+// indicates the current viewport position in a document.
+
+// Constructor.
+function Scrollbar(parentElement) {
+    uiLogger.debug("Scrollbar(" + parentElement + ")");
+    
+    // get the parent element
+    this.parentElement = parentElement;
+    
+    // create the root element
+    this.rootElement = document.createElement("div");
+    this.rootElement.className = "Scrollbar";
+    this.rootElement.style.visibility = "hidden";
+    
+    // create the scrollbar
+    // the scrollbar consists of a root element with six children
+    // (three track elements and three thumb elements)
+    
+    // track
+    this.trackTopElement = document.createElement("div");
+    this.trackTopElement.className = "ScrollbarTrackTop";
+    this.trackMiddleElement = document.createElement("div");
+    this.trackMiddleElement.className = "ScrollbarTrackMiddle";
+    this.trackBottomElement = document.createElement("div");
+    this.trackBottomElement.className = "ScrollbarTrackBottom";
+    
+    // thumb
+    this.thumbTopElement = document.createElement("div");
+    this.thumbTopElement.className = "ScrollbarThumbTop";
+    this.thumbMiddleElement = document.createElement("div");
+    this.thumbMiddleElement.className = "ScrollbarThumbMiddle";
+    this.thumbBottomElement = document.createElement("div");
+    this.thumbBottomElement.className = "ScrollbarThumbBottom";
+    
+    // assemble and attach the scrollbar
+    this.rootElement.appendChild(this.trackTopElement);
+    this.rootElement.appendChild(this.trackMiddleElement);
+    this.rootElement.appendChild(this.trackBottomElement);
+    this.rootElement.appendChild(this.thumbTopElement);
+    this.rootElement.appendChild(this.thumbMiddleElement);
+    this.rootElement.appendChild(this.thumbBottomElement);
+    this.parentElement.appendChild(this.rootElement);
+    
+    // bring the scrollbar up to date
+    this.update(0, 100, 100);
+}
+
+// Parent element for the scrollbar.
+Scrollbar.prototype.parentElement = null;
+
+// Root HTML element in the scrollbar.
+Scrollbar.prototype.rootElement = null;
+
+// Scrollbar track top element.
+Scrollbar.prototype.trackTopElement = null;
+
+// Scrollbar track middle element.
+Scrollbar.prototype.trackMiddleElement = null;
+
+// Scrollbar track bottom element.
+Scrollbar.prototype.trackBottomElement = null;
+
+// Scrollbar thumb top element.
+Scrollbar.prototype.thumbTopElement = null;
+
+// Scrollbar thumb middle element.
+Scrollbar.prototype.thumbMiddleElement = null;
+
+// Scrollbar thumb bottom element.
+Scrollbar.prototype.thumbBottomElement = null;
+
+// Is the scrollbar needed?
+Scrollbar.prototype.scrollbarNeeded = false;
+
+// Updates the scrollbar.
+Scrollbar.prototype.update = function(scrollY, viewportHeight, documentHeight) {
+    // figure out current heights
+    var scrollbarHeight = this.rootElement.clientHeight;
+    var trackTopHeight = this.trackTopElement.clientHeight;
+    var trackBottomHeight = this.trackBottomElement.clientHeight;
+    var thumbTopHeight = this.thumbTopElement.clientHeight;
+    var thumbBottomHeight = this.thumbBottomElement.clientHeight;
+    
+    // scrollable height is the larger of document and viewport heights
+    var scrollableHeight = documentHeight;
+    var scrollbarNeeded = true;
+    if (viewportHeight >= documentHeight) {
+        scrollableHeight = viewportHeight;
+        scrollbarNeeded = false;
+    }
+    
+    // show or hide scrollbar?
+    if (scrollbarNeeded != this.scrollbarNeeded) {
+        this.scrollbarNeeded = scrollbarNeeded;
+        this.rootElement.style.visibility = scrollbarNeeded ? "visible" : "hidden";
+    }
+    
+    // calculate thumb top position...
+    var thumbTopPct = scrollY / scrollableHeight;
+    var thumbTop = scrollbarHeight * thumbTopPct;
+    // ...and bottom position...
+    var thumbBottomPct = (scrollY + viewportHeight) / scrollableHeight;
+    var thumbBottom = scrollbarHeight * thumbBottomPct;
+    
+    // ...and thumb height
+    var thumbHeight = thumbBottom - thumbTop;
+    
+    // ensure that the thumb is not too small
+    var thumbMinHeight = thumbTopHeight + thumbBottomHeight;
+    if (thumbHeight < thumbMinHeight) {
+        var underflow = thumbMinHeight - thumbHeight;
+        // adjust thumb top pos assuming a shorter scrollbar track
+        var thumbMid = (scrollbarHeight - underflow) * ((thumbTopPct + thumbBottomPct) / 2) + (underflow / 2);
+        thumbTop = thumbMid - (thumbMinHeight / 2);
+        thumbBottom = thumbTop + thumbMinHeight;
+        thumbHeight = thumbBottom - thumbTop;
+    }
+    
+    // position and size track element (add 1 to the middle section height for rounding errors)
+    this.trackTopElement.style.top = "0px";
+    this.trackMiddleElement.style.top = Math.round(trackTopHeight) + "px";
+    this.trackMiddleElement.style.height = Math.round(scrollbarHeight - trackTopHeight - trackBottomHeight + 1) + "px";
+    this.trackBottomElement.style.top = Math.round(scrollbarHeight - trackTopHeight) + "px";
+    
+    // position and size thumb element (add 1 to the middle section height for rounding errors)
+    this.thumbTopElement.style.top = Math.round(thumbTop) + "px";
+    this.thumbMiddleElement.style.top = Math.round(thumbTop + thumbTopHeight) + "px";
+    this.thumbMiddleElement.style.height = Math.round(thumbHeight - thumbTopHeight - thumbBottomHeight + 1) + "px";
+    this.thumbBottomElement.style.top = Math.round(thumbBottom - thumbBottomHeight) + "px";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/SelectionControl.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,189 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The SelectionControl class is an abstract base class for controls that lets
+// the user select one or more options from a list of options. Don't use
+// SelectionControl directly.
+
+// Constructor.
+function SelectionControl(id, caption, options, multipleSelection, selected) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, options, multipleSelection, selected);
+    }
+}
+
+// SelectionControl inherits from Control.
+SelectionControl.prototype = new Control(UI_NO_INIT_ID);
+
+// List of options.
+SelectionControl.prototype.options = null;
+
+// The single selected option in single selection controls
+// or list of options in multi selection controls.
+SelectionControl.prototype.selected = null;
+
+// Single or multiple selection.
+SelectionControl.prototype.multipleSelection = false;
+
+// Initializer - called from constructor.
+SelectionControl.prototype.init = function(id, caption, options, multipleSelection, selected) {
+    uiLogger.debug("SelectionControl.init(" + id + ", " + caption + ", " + options + ", " + multipleSelection + ", " + selected + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // set the multiple selection property
+    this.multipleSelection = multipleSelection;
+    
+    // init options and selected (makes copies of the original arrays)
+    this.options = (options != null) ? options.slice(0) : [];
+    if (multipleSelection) {
+        this.selected = (selected == null) ? [] : selected.slice(0);
+    } else {
+        this.selected = selected;
+    }
+    this.validateSelected();
+}
+
+// Returns true if the control is a multiple selection control; false if single.
+SelectionControl.prototype.isMultipleSelection = function() {
+    return this.multipleSelection;
+}
+
+// Returns true if the specified option is selected; false if not.
+SelectionControl.prototype.isSelected = function(option) {
+    if (this.multipleSelection) {
+        // multiple selection
+        // iterate through all selected options and look for the specified option
+        for (var i = 0; i < this.selected.length; i++) {
+            if (this.selected[i] == option) {
+                return true;
+            }
+        }
+        return false;
+    } else {
+        // single selection
+        return (this.selected == option);
+    }
+}
+
+// Returns the currently selected option in a single selection control or
+// an array of selected options in a multiple selection control. If there are
+// no selected options a single selection control returns null and a multiple
+// selection control returns an empty array.
+SelectionControl.prototype.getSelected = function() {
+    return this.multipleSelection ? this.selected.slice(0) : this.selected;
+}
+
+// Sets the currently selected options. Pass a single option in a single selection
+// control or an array of selected controls in a multiple selection control. To
+// deselect all options pass null in a single selection control and an empty array
+// in a multiple selection control.
+// Override in sublcasses to provide full implementation.
+SelectionControl.prototype.setSelected = function(selected) {
+    this.selected = this.multipleSelection ? selected.slice(0) : selected;
+    // make sure the selected option or options are legal
+    this.validateSelected();
+}
+
+// Ensures that the selected option or options exist among the options in this control.
+SelectionControl.prototype.validateSelected = function() {
+    if (this.multipleSelection) {
+        // multiple selection
+        // iterate through all selected options and ensure they exist among the options
+        for (var i = 0; i < this.selected.length; i++) {
+            // check that the selected option exists among the options
+            var found = false;
+            for (var j = 0; j < this.options.length; j++) {
+                if (this.options[j] == this.selected[i]) {
+                    // found - stop looking for this option
+                    found = true;
+                    break;
+                }
+            }
+            // not found - remove this selected element
+            if (!found) {
+                this.selected.splice(i, 1);
+                // since we removed an entry we must re-check this position
+                i--;
+            }
+        }
+    } else {
+        // single selection
+        if (this.selected != null) {
+            // check that the selected option exists among the options
+            for (var i = 0; i < this.options.length; i++) {
+                if (this.options[i] == this.selected) {
+                    // found - we're done
+                    return;
+                }
+            }
+            // not found - remove the selection
+            this.selected = null;
+        }
+    }
+}
+
+// Returns the options in the control as an array of option objects with
+// a value and text property.
+SelectionControl.prototype.getOptions = function() {
+    return this.options;
+}
+
+// Sets the options in the control.
+// Override in sublcasses to provide full implementation.
+SelectionControl.prototype.setOptions = function(options) {
+    this.options = options.slice(0);
+    // make sure the selected option or options are legal
+    this.validateSelected();
+}
+
+// Returns the option that has the specified value; null if none.
+SelectionControl.prototype.getOptionForValue = function(value) {
+    // iterate through all options and look for a match
+    for (var i = 0; i < this.options.length; i++) {
+        if (this.options[i].value == value) {
+            return this.options[i];
+        }
+    }
+    return null;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/SelectionList.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,355 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The SelectionList class implements a single or multi selection control
+// that lets users select one or more options from a list of options.
+
+// Constructor.
+function SelectionList(id, caption, options, multipleSelection, selected) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, options, multipleSelection, selected);
+    }
+}
+
+// SelectionList inherits from SelectionControl.
+SelectionList.prototype = new SelectionControl(UI_NO_INIT_ID);
+
+// Root element for options.
+SelectionList.prototype.optionListElement = null;
+
+// Array for tracking option elements.
+SelectionList.prototype.optionElements = null;
+
+// Tracking for currently focused option; null if none.
+SelectionList.prototype.focusedOption = null;
+
+// Enabled status.
+SelectionList.prototype.enabled = false;
+
+// Initializer - called from constructor.
+SelectionList.prototype.init = function(id, caption, options, multipleSelection, selected) {
+    uiLogger.debug("SelectionList.init(" + id + ", " + caption + ", " + options + ", " + multipleSelection + ", " + selected + ")");
+    
+    // call superclass initializer
+    SelectionControl.prototype.init.call(this, id, caption, options, multipleSelection, selected);
+    
+    // create option list element
+    this.optionListElement = document.createElement("div");
+    this.controlElement.appendChild(this.optionListElement);
+    
+    // the control defaults to enabled
+    this.enabled = true;
+    
+    // init option element arrays
+    this.optionElements = [];
+    
+    // update the option elements to match the options in this control
+    this.updateOptionElements();
+}
+
+// Returns the enabled state.
+SelectionList.prototype.isEnabled = function() {
+    return this.enabled;
+}
+
+// Sets the enabled state.
+SelectionList.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("SelectionList.setEnabled(" + enabled + ")");
+    // switch the state and update the the control
+    this.enabled = enabled;
+    this.updateOptionElements();
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+SelectionList.prototype.setFocused = function(focused) {
+    uiLogger.debug("SelectionList.setFocused(" + focused + ")");
+    if (this.enabled && this.optionElements.length > 0) {
+        if (focused) {
+            this.optionElements[0].link.focus();
+        } else {
+            this.optionElements[0].link.blur();
+        }
+    }
+}
+
+// Sets the currently selected options. Pass a single option in a single selection
+// control or an array of selected controls in a multiple selection control. To
+// deselect all options pass null in a single selection control and an empty array
+// in a multiple selection control.
+SelectionList.prototype.setSelected = function(selected) {
+    // call superclass setSelected()
+    SelectionControl.prototype.setSelected.call(this, selected);
+    this.updateStyleFromState();
+}
+
+// Sets the options in the control.
+SelectionList.prototype.setOptions = function(options) {
+    // call superclass setOptions()
+    SelectionControl.prototype.setOptions.call(this, options);
+    this.updateOptionElements();
+}
+
+// Updates the option elements for the control element.
+SelectionList.prototype.updateOptionElements = function() {
+    uiLogger.debug("SelectionControl.updateOptionElements()");
+    
+    // start by removing all current options from the option list element
+    while (this.optionListElement.firstChild != null) {
+        this.optionListElement.removeChild(this.optionListElement.firstChild);
+    }
+    
+    // iterate through the options and add (and possibly create) a
+    // properly configured option element for each option
+    for (var i = 0; i < this.options.length; i++) {
+        // get the option and option element we're working on
+        var option = this.options[i];
+        
+        // option, link and text elements for this option
+        var optionElement;
+        var optionLinkElement;
+        var optionTextElement;
+        
+        // get the elements
+        if (i == this.optionElements.length) {
+            // we need to create a new option element...
+            optionElement = document.createElement("div");
+            
+            // ...and a new option link element...
+            optionLinkElement = document.createElement("a");
+            optionLinkElement.href = "JavaScript:void(0)";
+            
+            // ...and a new option text element
+            optionTextElement = document.createElement("span");
+            
+            // hook up event listeners to the element
+            var self = this;
+            optionLinkElement.addEventListener("focus", function(event) { self.optionFocusStateChanged(event, true); }, false);
+            optionLinkElement.addEventListener("blur", function(event) { self.optionFocusStateChanged(event, false); }, false);
+            optionElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+            optionElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+            optionElement.addEventListener("mousedown", function(event) {
+                                                               self.optionClicked(event)
+                                                               event.stopPropagation();
+                                                               event.preventDefault();
+                                                        }, true);
+            optionElement.addEventListener("keydown", function(event) {
+                                                            // center and enter trigger the action
+                                                            if (event.keyCode == 0 || event.keyCode == 13) {
+                                                                self.optionClicked(event)
+                                                                event.stopPropagation();
+                                                                event.preventDefault();
+                                                            }
+                                                      }, true);
+            
+            // add the elements to the option element array
+            this.optionElements.push({ option: optionElement, link: optionLinkElement, text: optionTextElement });
+        } else {
+            // we already have ready elements so we'll reuse them
+            optionElement = this.optionElements[i].option;
+            optionLinkElement = this.optionElements[i].link;
+            optionTextElement = this.optionElements[i].text;
+            
+            // remove the option link element from its current parent - if any
+            if (optionLinkElement.parentNode != null) {
+                optionLinkElement.parentNode.removeChild(optionLinkElement);
+            }
+            
+            // remove the option text element from its current parent - if any
+            if (optionTextElement.parentNode != null) {
+                optionTextElement.parentNode.removeChild(optionTextElement);
+            }
+        }
+        
+        // set the option text
+        optionTextElement.innerHTML = option.text;
+        
+        // hook up the option to the control
+        if (this.enabled) {
+            // add the option link element to the option element
+            optionElement.appendChild(optionLinkElement);
+            // add the text element to the option element
+            optionLinkElement.appendChild(optionTextElement);
+        } else {
+            // add the text element directly to the control element
+            optionElement.appendChild(optionTextElement);
+        }
+        // add the option element to the option list element
+        this.optionListElement.appendChild(optionElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Callback for focus state change events.
+SelectionList.prototype.optionFocusStateChanged = function(event, focused) {
+    uiLogger.debug("SelectionControl.optionFocusStateChanged()");
+    
+    // get the event source option
+    var option = null;
+    var optionElement = null;
+    for (var i = 0; i < this.optionElements.length; i++) {
+        optionElement = this.optionElements[i];
+        if (optionElement.link == event.currentTarget) {
+            option = this.options[i];
+            break;
+        }
+    }
+    
+    // remember the focused option; or null if none is focused
+    if (focused) {
+        this.focusedOption = option;
+    } else {
+        this.focusedOption = null;
+    }
+    
+    // call the superclass focus state change handler
+    this.focusStateChanged(focused);
+}
+
+// Callback for clicks.
+SelectionList.prototype.optionClicked = function(event) {
+    uiLogger.debug("SelectionControl.optionClicked()");
+    
+    // bail out if we're not enabled
+    if (!this.enabled) {
+        return false;
+    }
+    
+    // get the changed option
+    var option = null;
+    var optionElement = null;
+    for (var i = 0; i < this.optionElements.length; i++) {
+        optionElement = this.optionElements[i];
+        if (optionElement.option == event.currentTarget) {
+            option = this.options[i];
+            break;
+        }
+    }
+    
+    // make sure the option is focused
+    optionElement.link.focus();
+    
+    // toggle the selection
+    if (this.multipleSelection) {
+        // iterate through the selected options and see if this
+        // option is selected. if not then add it to the selection.
+        // if it already is selected then them remove it.
+        var found = false;
+        for (var i = 0; i < this.selected.length; i++) {
+            if (this.selected[i] == option) {
+                // remove from selected set
+                found = true;
+                this.selected.splice(i, 1);
+                break;
+            }
+        }
+        if (!found) {
+            // add to the selected set
+            this.selected.push(option);
+        }
+    } else {
+        // update the selected option
+        this.selected = option;
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+    
+    // notify event listeners
+    this.fireEvent(this.createEvent("SelectionChanged", this.getSelected()));
+}
+
+// Resets the state tracking for focus and hover.
+// Override this in subclasses as required to implement the state reset.
+SelectionList.prototype.resetFocusState = function() {
+    uiLogger.debug("SelectionList.resetFocusState()");
+    this.hovering = false;
+    this.focused = false;
+    this.focusedOption = null;
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+SelectionList.prototype.updateStyleFromState = function() {
+    uiLogger.debug("SelectionList.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set option list and option class names
+    this.setClassName(this.optionListElement, "SelectionList SelectionList" + stateName);
+    for (var i = 0; i < this.options.length; i++) {
+        var option = this.options[i];
+        
+        // get the option and option text elements for this option
+        var optionElement = this.optionElements[i].option;
+        var optionTextElement = this.optionElements[i].text;
+        
+        // figure out the option state
+        var optionStateName = this.isSelected(option) ? "Checked" : "Unchecked";
+        if (!this.enabled) {
+            optionStateName += "Disabled";
+        } else if (this.focusedOption == option) {
+            optionStateName += "Focus";
+        } else {
+            optionStateName += "Normal";
+        }
+        
+        // set option element class names
+        if (this.multipleSelection) {
+            this.setClassName(optionElement, "SelectionListOptionMulti SelectionListOptionMulti" + optionStateName);
+        } else {
+            this.setClassName(optionElement, "SelectionListOptionSingle SelectionListOptionSingle" + optionStateName);
+        }
+        
+        // set option text class names
+        this.setClassName(optionTextElement, "SelectionListOptionText SelectionListOptionText" + stateName);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/SelectionMenu.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,204 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The SelectionMenu class implements a single or multi selection control
+// that lets users select one or more options from a menu.
+
+// Constructor.
+function SelectionMenu(id, caption, options, multipleSelection, selected) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, options, multipleSelection, selected);
+    }
+}
+
+// SelectionMenu inherits from SelectionControl.
+SelectionMenu.prototype = new SelectionControl(UI_NO_INIT_ID);
+
+// Reference to the peer HTML element.
+SelectionControl.prototype.peerElement = null;
+
+// Array for tracking option elements.
+SelectionMenu.prototype.optionElements = null;
+
+// Initializer - called from constructor.
+SelectionMenu.prototype.init = function(id, caption, options, multipleSelection, selected) {
+    uiLogger.debug("SelectionMenu.init(" + id + ", " + caption + ", " + options + ", " + multipleSelection + ", " + selected + ")");
+    
+    // call superclass initializer
+    SelectionControl.prototype.init.call(this, id, caption, options, multipleSelection, selected);
+    
+    // create the control
+    this.peerElement = document.createElement("select");
+    this.peerElement.multiple = multipleSelection;
+    this.controlElement.appendChild(this.peerElement);
+    
+    // init option elements array
+    this.optionElements = [];
+    
+    // update the option elements to match the options in this control
+    this.updateOptionElements();
+    
+    // bind event listeners
+    var self = this;
+    this.peerElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+    this.peerElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+    this.peerElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+    this.peerElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+    this.peerElement.addEventListener("change", function() { self.selectionChanged(); }, false);
+}
+
+// Returns the enabled state.
+SelectionMenu.prototype.isEnabled = function() {
+    return !this.peerElement.disabled;
+}
+
+// Sets the enabled state.
+SelectionMenu.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("SelectionMenu.setEnabled(" + enabled + ")");
+    this.peerElement.disabled = !enabled;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+SelectionMenu.prototype.setFocused = function(focused) {
+    uiLogger.debug("SelectionMenu.setFocused(" + focused + ")");
+    if (focused) {
+        this.peerElement.focus();
+    } else {
+        this.peerElement.blur();
+    }
+}
+
+// Sets the currently selected options. Pass a single option in a single selection
+// control or an array of selected controls in a multiple selection control. To
+// deselect all options pass null in a single selection control and an empty array
+// in a multiple selection control.
+SelectionMenu.prototype.setSelected = function(selected) {
+    // call superclass setSelected()
+    SelectionControl.prototype.setSelected.call(this, selected);
+    
+    // iterate through the options and set the selected state
+    // on the corresponding option element
+    for (var i = 0; i < this.options.length; i++) {
+        this.optionElements[i].selected = this.isSelected(this.options[i]);
+    }
+}
+
+// Sets the options in the control.
+SelectionMenu.prototype.setOptions = function(options) {
+    // call superclass setOptions()
+    SelectionControl.prototype.setOptions.call(this, options);
+    this.updateOptionElements();
+}
+
+// Updates the option elements for the peer select element.
+SelectionMenu.prototype.updateOptionElements = function() {
+    // start by removing all current options from the select element
+    while (this.peerElement.firstChild != null) {
+        this.peerElement.removeChild(this.peerElement.firstChild);
+    }
+    
+    // iterate through the options and add (and possibly create) a
+    // properly configured option element for each option
+    for (var i = 0; i < this.options.length; i++) {
+        // do we need to create a new option element?
+        if (i == this.optionElements.length) {
+            this.optionElements.push(document.createElement("option"));
+        }
+        
+        // get the option and option element we're working on
+        var option = this.options[i];
+        var optionElement = this.optionElements[i];
+        
+        // set the state for this option element and add it to the
+        // peer select element
+        optionElement.text = option.text;
+        optionElement.selected = this.isSelected(option);
+        this.peerElement.appendChild(optionElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();    
+}
+
+// Callback for selection change events.
+SelectionMenu.prototype.selectionChanged = function() {
+    uiLogger.debug("SelectionControl.selectionChanged()");
+    
+    // update the selected options array or reference
+    this.selected = (this.multipleSelection) ? [] : null;
+    for (var i = 0; i < this.options.length; i++) {
+        if (this.optionElements[i].selected) {
+            if (this.multipleSelection) {
+                this.selected.push(this.options[i]);
+            } else {
+                this.selected = this.options[i];
+                break;
+            }
+        }
+    }
+    
+    // notify event listeners
+    this.fireEvent(this.createEvent("SelectionChanged", this.getSelected()));
+}
+
+// Updates the style of the control to reflects the state of the control.
+SelectionMenu.prototype.updateStyleFromState = function() {
+    uiLogger.debug("SelectionMenu.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set select and option element class names
+    var peerStateName = this.isEnabled() ? stateName : "Disabled";
+    this.setClassName(this.peerElement, "SelectionMenu SelectionMenu" + peerStateName);
+    for (var i = 0; i < this.options.length; i++) {
+        var option = this.optionElements[i];
+        this.setClassName(option, "SelectionMenuOption SelectionMenuOption" + peerStateName);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/Separator.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,119 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Separator class is used to provide a visual separator in a list.
+
+// Constructor.
+function Separator(id) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id);
+    }
+}
+
+// Separator inherits from Control.
+Separator.prototype = new Control(UI_NO_INIT_ID);
+
+// Reference to the separator element.
+Separator.prototype.separatorElement = null;
+
+// Separator row element.
+Separator.prototype.tableRowElement = null;
+
+// Left cell element.
+Separator.prototype.tableLeftCellElement = null;
+
+// Center cell element.
+Separator.prototype.tableCenterCellElement = null;
+
+// Right cell element.
+Separator.prototype.tableRightCellElement = null;
+
+// Initializer - called from constructor.
+Separator.prototype.init = function(id) {
+    uiLogger.debug("Separator.init(" + id + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, null);
+    
+    // remove caption and control elements
+    this.assemblyElement.removeChild(this.captionElement);
+    this.assemblyElement.removeChild(this.controlElement);
+    
+    // create separator
+    this.separatorElement = document.createElement("table");
+    this.tableRowElement = document.createElement("tr");
+    this.tableLeftCellElement = document.createElement("td");
+    this.tableCenterCellElement = document.createElement("td");
+    this.tableRightCellElement = document.createElement("td");
+    this.tableRowElement.appendChild(this.tableLeftCellElement);
+    this.tableRowElement.appendChild(this.tableCenterCellElement);
+    this.tableRowElement.appendChild(this.tableRightCellElement);
+    this.separatorElement.appendChild(this.tableRowElement);
+    this.assemblyElement.appendChild(this.separatorElement);
+    
+    // update style
+    this.updateStyleFromState();
+}
+
+// Returns the enabled state for the control.
+Separator.prototype.isEnabled = function() {
+    return true;
+}
+
+// Returns the focusable state for the control.
+Separator.prototype.isFocusable = function() {
+    return false;
+}
+
+// Updates the style of the control to reflects the state of the control.
+Separator.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Separator.updateStyleFromState()");
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    this.setClassName(this.separatorElement, "Separator");
+    this.setClassName(this.tableRowElement, "SeparatorRow");
+    this.setClassName(this.tableLeftCellElement, "SeparatorLeftCell");
+    this.setClassName(this.tableCenterCellElement, "SeparatorCenterCell");
+    this.setClassName(this.tableRightCellElement, "SeparatorRightCell");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/SlidingTransition.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,75 @@
+
+
+function SlidingScreenTransition(oldView, newView, direction, callback)
+{
+	/* DOM element to be "pushed out" */
+	this.currentScreen = oldView.rootElement;
+ 
+	/* DOM element to be "pulled in" */
+	this.nextScreen = newView.rootElement;
+ 
+	/* direction of the sliding transition */
+	this.direction = direction;
+	
+	// callback when done
+	this.callback = callback;
+}
+
+/* constant value for right-to-left transitions */
+SlidingScreenTransition.DIRECTION_LEFT = 1;
+ 
+/* constant value for left-to-right transitions */
+SlidingScreenTransition.DIRECTION_RIGHT = -1;
+ 
+/* total number of steps of the sliding transition */
+SlidingScreenTransition.TRANSITION_STEPS = 10;
+
+
+SlidingScreenTransition.prototype.start = function()
+{
+	var self = this;
+	
+	this.nextScreen.style.top = '0px';
+	this.nextScreen.style.left = (this.direction * screen.availWidth) + 'px';
+	
+	this.transitionStep = 0;
+	
+	this.transitionInterval = setInterval(
+		function()
+		{
+			self.doTransitionStep();
+		},
+		100
+	);
+}
+
+SlidingScreenTransition.prototype.stop	 = function() {
+	clearInterval ( this.transitionInterval );
+	if (this.callback) {
+		this.callback.call();
+	}
+}
+
+
+SlidingScreenTransition.prototype.doTransitionStep = function()
+{
+	this.transitionStep++;
+	
+	if(this.transitionStep <= SlidingScreenTransition.TRANSITION_STEPS)
+	{
+		this.nextScreen.style.left = 
+			(screen.availWidth * 
+			(SlidingScreenTransition.TRANSITION_STEPS - this.transitionStep) * 
+			this.direction / SlidingScreenTransition.TRANSITION_STEPS)
+			 + 'px';
+		
+		this.currentScreen.style.left = 
+			(- screen.availWidth * this.transitionStep * this.direction / 
+			SlidingScreenTransition.TRANSITION_STEPS) 
+			+ 'px';
+	}
+	else
+	{
+		this.stop();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/TextArea.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,96 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The TextArea class implements a multi line text entry control.
+
+// Constructor.
+function TextArea(id, caption, value, rows) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, value, rows);
+    }
+}
+
+// TextArea inherits from TextEntryControl.
+TextArea.prototype = new TextEntryControl(UI_NO_INIT_ID);
+
+// Initializer - called from constructor.
+TextArea.prototype.init = function(id, caption, value, rows) {
+    uiLogger.debug("TextArea.init(" + id + ", " + caption + ", " + value + ", " + rows + ")");
+    
+    // call superclass initializer
+    TextEntryControl.prototype.init.call(this, id, caption);
+    
+    // create the peer element
+    this.peerElement = document.createElement("textarea");
+    // default rowcount is 3 if not defined
+    // width always comes from style but is a required attribute
+    this.peerElement.rows = (rows != null) ? rows : 3;
+    this.peerElement.cols = 20;
+    this.controlElement.appendChild(this.peerElement);
+    
+    // set the value
+    this.peerElement.value = (value == null) ? "" : value;
+    
+    // bind event listeners
+    this.bindTextEntryControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+TextArea.prototype.updateStyleFromState = function() {
+    uiLogger.debug("TextArea.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set peer element class names
+    var peerStateName = this.isEnabled() ? stateName : "Disabled";
+    this.setClassName(this.peerElement, "TextArea TextArea" + stateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/TextEntryControl.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,125 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The TextEntryControl class is an abstract base class for the single and multi-
+// line text entry controls TextField and TextArea. Don't use TextEntryControl
+// directly.
+
+// Constructor.
+function TextEntryControl(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// TextEntryControl inherits from Control.
+TextEntryControl.prototype = new Control(UI_NO_INIT_ID);
+
+// Reference to the peer HTML element.
+TextEntryControl.prototype.peerElement = null;
+
+// Initializer - called from constructor.
+TextEntryControl.prototype.init = function(id, caption) {
+    uiLogger.debug("TextEntryControl.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+}
+
+// Common event listeners hookup function called from subclasses.
+TextEntryControl.prototype.bindTextEntryControlListeners = function() {
+    var self = this;
+    this.peerElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+    this.peerElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+    this.peerElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+    this.peerElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+    this.peerElement.addEventListener("change", function() { self.valueChanged(); }, false);
+}
+
+// Returns the enabled state.
+// Override this in subclasses as required to implement the state change.
+TextEntryControl.prototype.isEnabled = function() {
+    return !this.peerElement.readOnly;
+}
+
+// Sets the enabled state.
+// Override this in subclasses as required to implement the state change.
+TextEntryControl.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("TextEntryControl.setEnabled(" + enabled + ")");
+    this.peerElement.readOnly = !enabled;
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the control text.
+TextEntryControl.prototype.getText = function() {
+    return this.peerElement.value;
+}
+
+// Sets the text for the control.
+TextEntryControl.prototype.setText = function(text) {
+    this.peerElement.value = text;
+}
+
+// Returns the focusable state for the control.
+TextEntryControl.prototype.isFocusable = function() {
+    // text entry controls are always focusable
+    return true;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+TextEntryControl.prototype.setFocused = function(focused) {
+    uiLogger.debug("TextEntryControl.setFocused(" + focused + ")");
+    if (focused) {
+        this.peerElement.focus();
+    } else {
+        this.peerElement.blur();
+    }
+}
+
+// Callback for value change events.
+TextEntryControl.prototype.valueChanged = function() {
+    uiLogger.debug("TextEntryControl.valueChanged()");
+    // notify event listeners
+    this.fireEvent(this.createEvent("ValueChanged", this.peerElement.value));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/TextField.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,93 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The TextField class implements a single line text entry control.
+
+// Constructor.
+function TextField(id, caption, value, masked) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, value, masked);
+    }
+}
+
+// TextField inherits from TextEntryControl.
+TextField.prototype = new TextEntryControl(UI_NO_INIT_ID);
+
+// Initializer - called from constructor.
+TextField.prototype.init = function(id, caption, value, masked) {
+    uiLogger.debug("TextField.init(" + id + ", " + caption + ", " + value + ", " + masked + ")");
+    
+    // call superclass initializer
+    TextEntryControl.prototype.init.call(this, id, caption);
+    
+    // create the peer element
+    this.peerElement = document.createElement("input");
+    this.peerElement.type = masked ? "password" : "text";
+    this.controlElement.appendChild(this.peerElement);
+    
+    // set the value
+    this.peerElement.value = (value == null) ? "" : value;
+    
+    // bind event listeners
+    this.bindTextEntryControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+TextField.prototype.updateStyleFromState = function() {
+    uiLogger.debug("TextField.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set peer element class names
+    var peerStateName = this.isEnabled() ? stateName : "Disabled";
+    this.setClassName(this.peerElement, "TextField TextField" + peerStateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/UIElement.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,114 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The UIElement class is the base class for all user interface elements.
+
+// Constructor.
+function UIElement(id) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id);
+    }
+}
+
+// UI element identifier.
+UIElement.prototype.id = null;
+
+// Root HTML element in the UI element.
+UIElement.prototype.rootElement = null;
+
+// Initializer for UIElement.
+UIElement.prototype.init = function(id) {
+    uiLogger.debug("UIElement.init(" + id + ")");
+    
+    // copy identifier
+    this.id = id;
+    
+    // init event listener array
+    this.eventListeners = [];
+    
+    // create the root element
+    this.rootElement = document.createElement("div");
+    if (id != null) {
+        this.rootElement.id = id;
+    }
+}
+
+// Returns an array containing the current event listeners.
+UIElement.prototype.getEventListeners = function() {
+    return this.eventListeners;
+}
+
+// Adds an event listener.
+UIElement.prototype.addEventListener = function(eventType, listener) {
+    var listenerDef = { type: eventType, listener: listener };
+    this.eventListeners.push(listenerDef);
+}
+
+// Removes an event listener.
+UIElement.prototype.removeEventListener = function(eventType, listener) {
+    // iterate through current listeners and remove the specified
+    // listener when its found
+    for (var i = 0; i < this.eventListeners.length; i++) {
+        var listenerDef = this.eventListeners[i];
+        if ((listenerDef.type == eventType) &&
+                (listenerDef.listener == listener)) {
+            this.eventListeners.splice(i, 1);
+            return;
+        }
+    }
+}
+
+// Factory method for an event object where this object is the source object.
+UIElement.prototype.createEvent = function(type, value) {
+    return { source: this, type: type, value: value };
+}
+
+// Fires an event to all listeners.
+UIElement.prototype.fireEvent = function(event) {
+    // iterate through all event listeners and notify them of the event
+    for (var i = 0; i < this.eventListeners.length; i++) {
+        var listenerDef = this.eventListeners[i];
+        if (listenerDef.type == null || listenerDef.type == event.type) {
+            listenerDef.listener.call(this, event);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/UIInit.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,49 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The UIInit script is included before the rest of the UI scripts to setup
+// any resources needed by the UI toolkit.
+
+// Create UI logger.
+var uiLogger = new Logger();
+uiLogger.level = uiLogger.LOG_LEVEL_DEBUG;
+uiLogger.filter = ["QECR"];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/UIManager.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,245 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+
+///////////////////////////////////////////////////////////////////////////////
+// The UI manager manages a set of views and other user interface elements.
+
+// Constructor.
+function UIManager(viewParentElement, scrollbarParentElement, enableScrollBar, delayInit) {    
+    uiLogger.debug("UIManager(" + viewParentElement + ", " + scrollbarParentElement + ")");
+    if (delayInit == null) {
+        this.init(viewParentElement, enableScrollBar, scrollbarParentElement);
+    }
+}
+
+// Parent element for views.
+UIManager.prototype.viewParentElement = null;
+
+// Parent element for scrollbar.
+UIManager.prototype.scrollbarParentElement = null;
+
+// The currently displayed view.
+UIManager.prototype.currentView = null;
+
+// Reference to the scrollbar.
+UIManager.prototype.scrollbar = null;
+
+// Current scroll Y position.
+UIManager.prototype.scrollY = -1;
+
+// Current viewport height.
+UIManager.prototype.viewportHeight = -1;
+
+// Current document height.
+UIManager.prototype.documentHeight = -1;
+
+// Timer identifier or null if no active timer.
+UIManager.prototype.timerId = null;
+
+// Interval for timer ticks for the UI manager timer (in milliseconds)
+UIManager.prototype.TIMER_INTERVAL = 250;
+
+// Reference to the notification popup used to displays notifications.
+UIManager.prototype.notificationPopup = null;
+
+// is scrollbar enabled
+UIManager.prototype.enableScrollBar = null;
+
+// View switch animation
+UIManager.prototype.viewSwitchAnimation = false;
+UIManager.prototype.viewSwitchTimer = null;
+UIManager.prototype.viewSwitchDivPos = 0;
+UIManager.prototype.VIEW_SWITCH_TIMER_INTERVAL = 25;
+
+// init function
+UIManager.prototype.init = function(viewParentElement, enableScrollBar, scrollbarParentElement) {
+    this.enableScrollBar = enableScrollBar;
+    
+    // parent element for views
+    if (viewParentElement == null) {
+        // create a parent for views
+        this.viewParentElement = document.createElement("div");
+        this.viewParentElement.className = "ViewContainer";
+        document.body.appendChild(this.viewParentElement);
+    }
+    else {
+        this.viewParentElement = viewParentElement;
+    }
+    
+    // parent element for scrollbar
+    if (enableScrollBar) {
+        if (scrollbarParentElement == null) {
+            // create a parent for the scrollbar
+            this.scrollbarParentElement = document.createElement("div");
+            this.scrollbarParentElement.className = "DocumentScrollbarContainer";
+            document.body.appendChild(this.scrollbarParentElement);
+        }
+        else {
+            this.scrollbarParentElement = scrollbarParentElement;
+        }
+    }
+    
+    // currently selected view
+    this.currentView = null;
+    
+    // create the notification popup
+    // the notification popup adds itself as a child element to the document body
+    this.notificationPopup = new NotificationPopup();
+    
+    // create scrollbar
+    if (enableScrollBar) {
+        this.scrollbar = new Scrollbar(this.scrollbarParentElement);
+    }
+    
+    // setup scrollbar tracking
+    var self = this;
+    this.startTimer();
+    if (enableScrollBar) {
+        window.addEventListener("resize", function(){
+            self.updateScrollbar();
+        }, false);
+        window.addEventListener("scroll", function(){
+            self.updateScrollbar();
+        }, false);
+    }
+}
+
+// Returns the current view.
+UIManager.prototype.getView = function() {
+    return this.currentView;
+}
+
+// Switches to the specified view.
+UIManager.prototype.setView = function(view){
+	// remove the current view from the parent element
+	if (this.currentView != null) {
+		this.viewParentElement.removeChild(this.currentView.rootElement);
+	}
+	
+	// reset scroll
+	window.scrollTo(0, 0);
+	
+	// add the new view to the parent element
+	if (view != null) {
+		this.currentView = view;
+		this.currentView.resetControlFocusStates();
+		this.viewParentElement.appendChild(this.currentView.rootElement);
+	}
+	
+	// update scrollbar
+	if (this.enableScrollBar) {
+		this.updateScrollbar();
+	}
+	
+	// focus the first focusable control
+	// a timer is used to prevent unwanted focus shift
+	setTimeout(function(){	view.focusFirstControl();}, 1);
+}
+
+// Updates the scrollbar.
+UIManager.prototype.updateScrollbar = function() {
+    if (this.enableScrollBar) {
+        // get current viewport and document position and dimensions
+        var scrollY = window.scrollY;
+        var viewportHeight = window.innerHeight;
+        var documentHeight = Math.max(document.documentElement.scrollHeight, document.height);
+        
+        // check if the scroll position or view has changed
+        if (this.scrollY != scrollY ||
+                this.viewportHeight != viewportHeight ||
+                this.documentHeight != documentHeight) {
+            // scroll position or view has changed
+            this.scrollY = scrollY;
+            this.viewportHeight = viewportHeight;
+            this.documentHeight = documentHeight;
+            
+            // update the scrollbar
+            this.scrollbar.update(scrollY, viewportHeight, documentHeight);
+            uiLogger.debug("Scrollbar updated");
+        }
+    }
+}
+
+// Starts the view manager timer.
+UIManager.prototype.startTimer = function() {
+    if (this.timerId == null) {
+        uiLogger.debug("UIManager timer started");
+        var self = this;
+        // setup the timer
+        this.timerId = setInterval(function() { self.onTimer(); }, this.TIMER_INTERVAL);
+    } else {
+        uiLogger.warn("UIManager timer already running");
+    }
+}
+
+// Stops the view manager timer.
+UIManager.prototype.stopTimer = function() {
+    if (this.timerId != null) {
+        // stop the timer
+        clearTimeout(this.timerId);
+        this.timerId = null;
+    } else {
+        uiLogger.warn("UIManager timer already stopped");
+    }
+}
+
+// Timer callback function.
+UIManager.prototype.onTimer = function() {
+    if (this.enableScrollBar) {
+        // make sure the scrollbar is up to date
+        this.updateScrollbar();
+    }
+}
+
+// Displays a notification.
+UIManager.prototype.showNotification = function(displayTime, type, text, progress) {
+    uiLogger.debug("UIManager.showNotification(" + displayTime + ", " + type + ", " + text + ", " + progress + ")");
+    // use the notification popup to show the notification
+    this.notificationPopup.showNotification(displayTime, type, text, progress);
+}
+
+// Hides the currently displayed notification.
+UIManager.prototype.hideNotification = function() {
+    uiLogger.debug("UIManager.hideNotification()");
+    // hide the notification popup
+    this.notificationPopup.hideNotification();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/UI/View.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,131 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The View class is an abstract base class for views in the UI toolkit.
+// Don't use the View directly - instead use a concrete subclass like ListView.
+
+// Constructor.
+function View(id) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id);
+    }
+}
+
+// View inherits from UIElement.
+View.prototype = new UIElement(UI_NO_INIT_ID);
+
+// Currently focused control.
+View.prototype.focusedControl = null;
+
+// Allows going back from every view
+View.prototype.previousView = null;
+
+// Initializer - called from constructor.
+View.prototype.init = function(id) {
+    uiLogger.debug("View.init(" + id + ")");
+    
+    // call superclass initializer
+    UIElement.prototype.init.call(this, id);
+}
+
+// Returns the currently focused control; null if none.
+View.prototype.getFocusedControl = function() {
+    return this.focusedControl;
+}
+
+// Used to notify the view that the focused control has changed.
+View.prototype.focusedControlChanged = function(control) {
+    uiLogger.debug("View.focusedControlChanged(" + control + ")");
+    this.focusedControl = control;
+    // notify event listeners
+    this.fireEvent(this.createEvent("FocusedControlChanged", this.focusedControl));
+}
+
+// Attempts to focus the first focusable control.
+// Override in subclasses as required.
+View.prototype.focusFirstControl = function() {
+    uiLogger.debug("View.focusFirstControl()");
+}
+
+// Attempts to reset all control focus states.
+// Override in subclasses as required.
+View.prototype.resetControlFocusStates = function() {
+    uiLogger.debug("View.resetControlFocusStates()");
+}
+
+
+// ////////////////////////////////////////////////////////////////////
+// Added functions
+
+// set up soft keys. Default implementation sets right soft
+// key to Back if the previous view is set
+View.prototype.setupSoftKeys = function()  {
+    if (window.widget) {
+		if (this.previousView != null) {
+			var self = this;
+			menu.setRightSoftkeyLabel("Back", function(){self.goBack();});
+		} else {
+			menu.setRightSoftkeyLabel();
+		}
+    }
+}
+
+// show the view - sets up soft keys
+View.prototype.show = function () {
+	this.setupSoftKeys();
+	this.update(false);
+	uiManager.setView(this);
+}
+
+// abstract function for updating page content
+View.prototype.update = function(forceUpdate){
+}
+
+
+// Default back button handler takes us to previous view
+// if one is set
+View.prototype.goBack = function()  {
+	if ( this.previousView != null ) {
+		this.previousView.show();
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/Utils/Logger.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,117 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (ÒNokiaÓ) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under NokiaÕs copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// Logger utility class that uses the Firebug console class.
+
+// Constructor (everything is static so this is empty).
+function Logger() {
+    // Set default logger level.
+    this.level = this.LOG_LEVEL_OFF;
+}
+
+// Logger levels.
+Logger.prototype.LOG_LEVEL_DEBUG = 0;
+Logger.prototype.LOG_LEVEL_INFO = 1;
+Logger.prototype.LOG_LEVEL_WARN = 2;
+Logger.prototype.LOG_LEVEL_ERROR = 3;
+Logger.prototype.LOG_LEVEL_OFF = 4;
+
+Logger.prototype.level = null;
+Logger.prototype.filter = null;
+
+// Disable logging on other browsers except Firefox.
+Logger.prototype.enabled = (navigator.userAgent.indexOf("Firefox") != -1);
+
+// Dumps an objects properties and methods to the console.
+Logger.prototype.dump = function(obj) {
+    if (this.enabled) {
+        console.dir(obj);
+    }
+}
+
+// Dumps a stracktrace to the console.
+Logger.prototype.trace = function() {
+    if (this.enabled) {
+        console.trace();
+    }
+}
+
+// Prints a debug message to the console.
+Logger.prototype.debug = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_DEBUG) {
+        if (this.filter == null) {
+            console.debug(str);
+        } else {
+            var show = false;
+            for (i in this.filter) {
+                if (str.indexOf(this.filter[i]) >= 0) {
+                    show = true;
+                    break;
+                }
+            }
+            if (show) {
+                console.debug(str);
+            }
+        }
+    }
+}
+
+// Prints an info message to the console.
+Logger.prototype.info = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_INFO) {
+        console.info(str);
+    }
+}
+
+// Prints a warning message to the console.
+Logger.prototype.warn = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_WARN) {
+        console.warn(str);
+    }
+}
+
+// Prints an error message to the console.
+Logger.prototype.error = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_ERROR) {
+        console.error(str);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/WRTKit/WRTKit.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,93 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// This script includes the WRTKit for use in a widget.
+
+// WRTKit version (major.minor.revision, e.g. 1.0.0).
+var WRTKIT_VERSION_MAJOR = 1;
+var WRTKIT_VERSION_MINOR = 0;
+var WRTKIT_VERSION_REVISION = 0;
+var WRTKIT_RESOURCE_DIRECTORY = "WRTKit/Resources/";
+
+// Include util script files.
+includeScript("WRTKit/Utils/Logger.js");
+
+// Include UI visual definition.
+includeStyleSheet("WRTKit/Resources/UI.css");
+
+// Include all UI toolkit script files.
+var UI_NO_INIT_ID = "UI_NO_INIT_ID";
+
+includeScript("WRTKit/UI/UIInit.js");
+includeScript("WRTKit/UI/UIElement.js");
+includeScript("WRTKit/UI/Scrollbar.js");
+includeScript("WRTKit/UI/NotificationPopup.js");
+includeScript("WRTKit/UI/SlidingTransition.js");
+includeScript("WRTKit/UI/UIManager.js");
+includeScript("WRTKit/UI/View.js");
+includeScript("WRTKit/UI/ListView.js");
+includeScript("WRTKit/UI/Control.js");
+includeScript("WRTKit/UI/Separator.js");
+includeScript("WRTKit/UI/Label.js");
+includeScript("WRTKit/UI/ContentPanel.js");
+includeScript("WRTKit/UI/TextEntryControl.js");
+includeScript("WRTKit/UI/TextField.js");
+includeScript("WRTKit/UI/TextArea.js");
+includeScript("WRTKit/UI/SelectionControl.js");
+includeScript("WRTKit/UI/SelectionMenu.js");
+includeScript("WRTKit/UI/SelectionList.js");
+includeScript("WRTKit/UI/ActionControl.js");
+includeScript("WRTKit/UI/FormButton.js");
+includeScript("WRTKit/UI/NavigationButton.js");
+includeScript("WRTKit/UI/TabView.js");
+includeScript("WRTKit/UI/Ajax.js");
+includeScript("WRTKit/UI/ImageLabel.js");
+
+// Includes a script file by writing a script tag.
+function includeScript(src) {
+    document.write("<script type=\"text/javascript\" src=\"" + src + "\"></script>");
+}
+
+// Includes a style sheet by writing a style tag.
+function includeStyleSheet(src) {
+    document.write("<style type=\"text/css\"> @import url(\"" +  src + "\"); </style>");
+}
Binary file OSCON/day.png has changed
Binary file OSCON/day1.png has changed
Binary file OSCON/day2.png has changed
Binary file OSCON/day3.png has changed
Binary file OSCON/day4.png has changed
Binary file OSCON/day5.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/iCalReader.js	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,726 @@
+ /*************** START iCalReader.js ******************************************************************************/
+
+/* HEADER START
+
+    iCalendar Reader for Javascript v. 1.1
+    Parses and reads iCalendar data format.
+
+    By Per-Kristian Nordnes (pk@yammin.com), august 2007.  
+    Copyright (C) 2007 - Per Kristian Nordnes.
+    All rights reserved.        
+    
+    The parsing algorithm in iCalendar.parse() is inspired by a PHP-script by Roman Ožana.
+    
+    Changelog:
+      1.0 - Initial release (aug. 2007).
+      1.1 - Some fixes for parsing Google iCal-data. Thanks to Emilis Dambauskas (feb. 25, 2008)
+    
+    Contents:
+    
+      Class: iCalReader() - parser object.
+              Public methods:
+                  * Array prepareData(String data) : set and prepare iCalendar data to read. 
+                    Throws exception if invalid data.
+                  * void parse() : parse the data.
+                  * void sort()  : sort events in the calendar object.
+                  * vCalendar getCalendar() : get the calendar object.                                                         
+                        
+      Class: vCalendar() - calendar object.
+              Public methods:
+                  * Array<vEvent> getEvents() : get a array of the calendar events.
+                  * Int getNrOfEvents() : get the number of events.                   
+                  * Array<String> getPropertyNames() : get an array of the calendar's property names.
+                  * PropertyMap getProperties() : get the property map object for the calendar. 
+                  * 0bject getProperty(String key) : get a property value by name.
+                    Throws exception if property is not found (invalidPropertyException).
+                  * vEvent getEventAtIndex(int index) : get an event object at given position in calendar.                                  
+
+      Class: vEvent()  - event object.
+              Public methods:
+                  * Date getStartDate() : get the starting date for the event.
+                  * Date getEndDate() : get the ending date for the event.
+                  * String getTimezone() : get the timezone accociated with the event.
+                  * PropertyMap getRuleProperties() : get a map of rules for the event.
+                  * Array<String> getPropertyNames() : get an array of available property names.
+                  * Object getProperty(String key) : get an event property by name.
+                    Throws exception if property is not found (invalidPropertyException).
+                  * String getHtmlValue(String key) : get an string property in HTML format (\n become <br/>).
+                    Throws exception if property is not found (invalidPropertyException).       
+      
+      Class: PropertyMap() - property hashmap object for vCal and vEvent.
+              Public methods:
+                  * Object getProperty(String) : get property value of property with key.
+                  * void toString() : print an overview of the map's properties and values.
+                  * boolean containsValue(Object value) : check if the property map contains a given value.
+                  * boolean containsKey(String key) : check if the property map contains a given property name.
+                  * int size() : the length of the property map.
+
+      There are also several "private" methods which are used internally by the reader/parser (but available).
+      Please refer to the code for overview/documentation on these.                                                                                                                         
+
+    License:      
+      You may use this script, as long as this header is kept intact.
+      Released under the GNU General Public License Version 2 or later (the "GPL").
+   
+    Usage example:
+    
+      This example parses a iCalendar file and displays every property within it.
+      
+      [Begin example code]
+    
+      // Parse data
+      
+          var myTestData = [some string content of iCalendar file or stream];
+          
+          var myCalReader = new iCalReader(); // Construction of the reader object. 
+          myCalReader.prepareData(myTestData); // Prepare and set the data for the parser.
+          myCalReader.parse(); // Parse the data.
+          myCalReader.sort(); // Sort the data.
+
+      // Read data
+
+          // Get the calendar properties.            
+
+              var calendarInfo = 'Properties for calendar:\n\n';                                           
+
+              var calendarPropertyNames = myCalReader.getCalendar().getPropertyNames(); // Get the list of availale properties.           
+
+              for(var i=0; i<calendarPropertyNames.length; i++) { // Loop through all the properties.
+                var propertyName = calendarPropertyNames[i];
+                var propertyValue = myCalReader.getCalendar().getProperty(propertyName);
+                calendarInfo += 'Calendar property "'+propertyName+'" has value: "'+propertyValue+'"\n';
+              }
+
+              alert(calendarInfo);
+            
+          // Get the event properties.
+      
+              alert('About to show all events and their properties...');
+                                       
+              var events = myCalReader.getCalendar().getEvents(); // Get all events.
+               
+              for(var i=0; i<myCalReader.getCalendar().getNrOfEvents(); i++) { // Loop through all events.
+              
+                var event = myCalReader.getCalendar().getEventAtIndex(i); // A single event.        
+                
+                // Get Javascript date for start and end time.
+                var startDate = event.getStartDate();
+                var endDate = event.getEndDate();
+                var timeZone = event.getTimeZone();
+                
+                // Get rules.
+                var rules = event.getRuleProperties();
+                
+                var eventInfo = 'Showing properties for event number '+(i+1)+'.\n\n'+
+                                'This event starts '+startDate+' and ends '+endDate+'\n\n'+'Timezone is: "'+timeZone+'"\n\n'+
+                                'This event have the following rules: '+rules.toString()+'\n\n';                                
+                
+                var eventPropertyNames = event.getPropertyNames(); // Get the list of available properties.         
+                
+                for(var n=0; n<eventPropertyNames.length; n++) { // Loop through all the properties.                
+                  var propertyName = eventPropertyNames[n];
+                  var propertyValue = event.getProperty(propertyName);
+                  eventInfo += 'Property "'+propertyName+'" has value: "'+propertyValue+'"\n';                  
+                }
+                
+                alert(eventInfo);
+              
+              } // End for each event.
+          
+      [End example code]    
+
+HEADER END /*
+
+/*************** CLASS DEFINITIONS ***************************************************************************/
+
+ /**
+ * The main object for reading and parsing iCalendar data.
+ */   
+function iCalReader() {
+	this.data = null; // Holds the iCalendar input data.
+	this.calendar = new vCalendar(); // The VCALENDAR object.
+	this.eventCount = -1; // Tracks the number of events in the calendar.
+	this.lastKey = null;	// Reference to last proccessed key (property).
+}
+  // Class methods
+  
+  iCalReader.prototype = {
+  /**
+   * Prepares and sets the data for the parser.
+   * @input calendar file data (string).
+   * @throws invalidCalendarException
+   * @return prepared data (array of lines)       
+   */     
+      prepareData: function(data) {
+        // Fix for malformed Mozilla VCALENDAR syntax.
+      	this.data = data.replace(/[\r\n]{1,} ([:;])/g, '$1');
+      	// Make array of all the lines.
+        this.data = this.data.split(/\r?\n/);                
+        // Is it really a VCALENDAR?
+        if(this.data[0].indexOf('BEGIN:VCALENDAR') == -1) {
+          throw('invalidCalendarException');
+        }
+      	return this.data;
+      },
+	/**
+	 * Method that does the actual parsing.
+	 */   	
+      parse: function() {
+      	this.calendar = new vCalendar();
+        // Loop through all lines and analyze them.
+      	for(var i=0; i<this.data.length; i++) {
+    			var line = this.data[i];
+  			 // Get possible key/value for line.
+  				var values = this.returnKeyValue(line);
+  				key = values[0];
+  				value = values[1];
+  				switch(line) {	
+  					// It's a new event.
+  					case 'BEGIN:VEVENT':
+  						this.eventCount++;
+  						type = 'VEVENT';
+  						break;
+  					// It's a calendar property.
+  					case 'BEGIN:VCALENDAR':
+  					case 'BEGIN:DAYLIGHT':
+  					case 'BEGIN:VTIMEZONE':
+  					case 'BEGIN:STANDARD':
+  						type = value;
+  						break;
+  					// It's the end of the calendar property or event.
+  					case 'END:VEVENT':
+  					case 'END:VCALENDAR':
+  					case 'END:DAYLIGHT':
+  					case 'END:VTIMEZONE':
+  					case 'END:STANDARD':
+  						type = 'VCALENDAR';
+  						break;
+  					// Add data to the calendar or event.
+  					default:
+  						this.addToCalendar(type, key, value);
+  						break;
+  				}				
+        } 
+      },
+  /**
+   * Adds data to the calendar object from the parser.
+   * @input type of current item in parsing queue.
+   * @input key (name) of item property.
+   * @input value of item property.                     
+   */     
+      addToCalendar: function(type, key, value) {    
+        // Make a new event if we are not proccessing a current one and type is VEVENT.
+        if(type == 'VEVENT') {        
+          try {
+            var event = this.calendar.getEventAtIndex(this.eventCount);
+          } catch(e) {
+            var event = new vEvent();
+            this.calendar.addEvent(event);
+          }
+        }    
+        // If no key, add the current value to currently proccessing property's value.
+    		if (key == false) {
+    			key = this.lastKey;
+    			var oldValue;
+    			switch(type) {
+    				case 'VEVENT':
+    			      oldValue = this.calendar.getEventAtIndex(this.eventCount).getProperty(key); 			 
+                value = oldValue+this.trimStart(value);
+                break;
+    			}
+    		}
+    		// Convert calendar date properties to javascript date.
+    		if ((key == 'DTSTAMP') || (key == 'LAST-MODIFIED') || (key == 'CREATED')) {
+    		    value = this.toDate(value);
+        } 
+        // Convert event date properties to own detailed mapping.
+    		if (key.indexOf('DTSTART') > -1 || key.indexOf('DTEND') > -1|| key.indexOf('ALTDTSTART') > -1) {
+    		    var dateArray = this.toDateProperties(key,value);
+    		    key = dateArray[0];
+    		    value = dateArray[1];
+        }
+    		// Parse any rules for item.
+        if (key == 'RRULE' ) {
+          value = this.makeRuleProperties(value);
+        }
+        // Add the data.    
+        switch(type) {
+          // It's an event. Add property and value to event.
+    			case 'VEVENT': 
+            this.calendar.getEventAtIndex(this.eventCount).setProperty(key,value);
+            break;
+    			// It's a calendar's property. 
+    			default:
+    				this.calendar.setProperty(key,value);
+    				break;
+    		}
+        // Reference last proccessed key.
+        this.lastKey = key;
+    	},
+  /**
+   * Make rule property map.
+   * @input string RRULE-string.
+   * @return PropertyMap of rules.   
+   */     
+      makeRuleProperties: function(value) {      
+        var ruledata = value.split(';');
+        var rule = new PropertyMap();
+        for(var r in ruledata) {
+            var data = ruledata[r].split('=');
+            rule.put(data[0], data[1]);
+        }
+        return rule;
+      },    	
+  /**
+   * Parse a VEVENT type date to a own property map object.
+   * @input string property name (like "DTSTART;TZID=Europe/Oslo")
+   * @input string property value (like "20070719T220000").       
+   * @return array(string DTSTART or DTEND, PropertyMap{ property JSDATE = [Date], property TZID = [string] } )   
+   */     
+      toDateProperties: function(key,value) {
+
+          var dtProperty = new PropertyMap();
+          dtProperty.put('TZID', 'Undefined'); // Default in case we don't find any timezone data.
+          
+          // Convert time to JS-date and make property.
+          dtProperty.put('JSDATE', this.toDate(value));
+
+          // Get date info from key value.
+          var dtInfo = key.split(';');
+          
+          key = dtInfo[0]; // Shorten the key to read DTSTART or DTEND not "DTSTART;TZID=Europe/Oslo".
+          dtProperty.put(key, value);
+          
+          if(typeof(dtInfo[1]) != 'undefined') { // Timezone is specified.
+            // Get timezone.
+            var tzInfo = dtInfo[1].split('=');
+            var timezoneValue = tzInfo[1];
+            dtProperty.put('TZID', timezoneValue);
+        		return new Array(key,dtProperty);          
+          } else {
+            // Try get the calendar default TZ.
+            try { dtProperty.put('TZID', this.calendar.getProperty('TZID')); } catch(e) {}
+            try { dtProperty.put('TZID', this.calendar.getProperty('X-WR-TIMEZONE')); } catch(e) {}            
+            return new Array(key,dtProperty);
+        	}
+      },
+  /**
+   * Convert a iCal type timestamp to Javascript date.
+   * @input calendar type date string.
+   * @return javascript date object.
+   * @throws invalidDateException.     
+   */     
+      toDate: function(dateString) {
+        dateString = dateString.replace('T', '');
+        dateString = dateString.replace('Z', '');
+        var pattern = /([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})([0-9]{0,2})/; 
+        
+        try {
+          var dArr = pattern.exec(dateString);
+          var calDate = new Date();
+
+          var months = (dArr[2][0] == '0') ? dArr[2][1] : dArr[2];
+          months = parseInt(months)-1;
+          var days = (dArr[3][0] == '0') ? dArr[3][1] : dArr[3];
+          days = parseInt(days);
+          
+          var hours = (dArr[4][0] == '0') ? dArr[4][1] : dArr[4];
+          hours = hours == '' ? '0' : hours;
+          hours = parseInt(hours);
+          
+          var minutes = (dArr[5][0] == '0') ? dArr[5][1] : dArr[5];
+          minutes = minutes == '' ? '0' : minutes;
+          minutes = parseInt(minutes);
+          
+          var seconds = (dArr[6][0] == '0') ? dArr[6][1] : dArr[6];
+          seconds = seconds == '' ? '0' : seconds;
+          seconds = parseInt(seconds);
+          
+          calDate.setFullYear(dArr[1]);
+          calDate.setMonth(months);
+          calDate.setDate(days);
+          calDate.setHours(hours);
+          calDate.setMinutes(minutes);
+          calDate.setSeconds(seconds);
+
+        } catch(e) {
+          throw('invalidDateException');
+        }
+        return calDate;
+      },
+  /**
+   * Returns a possible value/key-set of a calendar data line.
+   * @input calendar data line (string).
+   * @return array of key,value.       
+   */     
+    	returnKeyValue: function(line) {    
+        // Regex for VCALENDAR syntax. Match letters in uppercase in the beginning
+        // of the line followed by VCALENDAR-type operator and value.
+        var pattern = /^([A-Z]+[^:]+)[:]([\w\W]*)/;
+        var matches = pattern.exec(line);
+        if(matches) {
+              return matches.splice(1,2);
+        }
+        // No key found, just return value.
+        return new Array(false,line);
+    	},
+  /**
+   * Trims the beginning of string one whitespace character.
+   * @input string to trim.
+   * @return trimmed string.          
+   */     
+      trimStart: function(str) {
+        str=str.replace(/^\s{0,1}(.*)/, '$1');
+        return str;
+      },            
+	/**
+	 * Get the calendar object for the reader.
+	 * @return vCalendar object.    	 
+	 */   	
+    	getCalendar: function() {
+    		return this.calendar;
+    	},
+  /**
+   * Sorts the calendar events by time desc.   
+   *
+   */
+      sort: function(){
+        this.calendar.sort();
+      }     
+}
+
+/**
+ * Object to hold the calendar propterties.
+ */   
+function vCalendar() {
+    this.vEvents = new Array();
+    this.properties = new PropertyMap();
+}
+    // Class methods
+    
+  vCalendar.prototype = {
+  /**
+   * Gets the event array.
+   * @return array of event objects.       
+   */     
+      getEvents: function() {
+        return this.vEvents;
+      },
+  /**
+   * Gets the properties hashmap.
+   * @return PropertyMap.       
+   */     
+      getProperties: function() {
+        return this.properties;
+      },
+  /**
+   * Get the number of events.
+   * @return number   
+   */        
+      getNrOfEvents: function() {
+        return this.vEvents.length;
+      },
+  /**
+   * Sorts the array of events by time desc.   
+   *
+   */
+      sort: function(){
+        this.vEvents = this.vEvents.sort(this.sortByDate);
+      },        
+  /**
+   * Get list of available properties for the calendar.
+   * @return array of strings.       
+   */     
+      getPropertyNames: function() {
+        return this.properties.keys();
+      },
+  /**
+   * Get an event at a given index.
+   * @input int index.
+   * @return vEvent event.              
+   */
+      getEventAtIndex: function(index) {
+        var evt = this.vEvents[index];
+        if(typeof(evt) == 'undefined') {
+          throw('eventNotFoundException');
+        }
+        return this.vEvents[index];
+      },
+  /**
+   * Get value of a given property.
+   * @input string property name.
+   * @return object value.         
+   */
+      getProperty: function(property) {  
+        try {
+          return this.properties.get(property);      
+        } catch(e) {
+          throw(e); 
+        }
+      },
+  /**
+   * Adds a vEvent object to the event array.
+   * @input vEvent event.       
+   */
+      addEvent: function(vEvent) {
+        this.vEvents.push(vEvent);
+      },
+  /**
+   * Set a property to the calendar.
+   * @input string property name.
+   * @input object value.              
+   */
+      setProperty: function(property, value) {
+        if(typeof(property) == 'string' && property != null && property != '') {      
+          this.properties.put(property,value);
+        } else {
+          throw('invalidKeyNameException');
+        }
+      },
+  /**
+   * Sorting method for the events.
+   *
+   */
+      sortByDate: function(a, b) {
+          var x = a.getStartDate();
+          var y = b.getStartDate();
+          return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+      }      
+  }
+
+/**
+ * Object to hold the VEVENT propterties.
+ */   
+function vEvent() {
+  this.properties = new PropertyMap();
+}
+  // Class methods
+  
+  vEvent.prototype = {
+    /**
+     * Get start time for event.
+     * @return Date start.         
+     */
+        getStartDate: function() {
+           var dt = this.getProperty('DTSTART');
+           return dt.get('JSDATE');
+        },
+    /**
+     * Get start time for event.
+     * @return Date start.         
+     */
+        getAltStartDate: function() {
+           var dt = this.getProperty('ALTDTSTART');
+           return dt.get('JSDATE');
+        },
+    /**
+     * Get end time for event.
+     * @return Date end.              
+     */
+        getEndDate: function() {
+           var dt = this.getProperty('DTEND');
+           return dt.get('JSDATE');
+        },
+    /**
+     * Get timezone for event.
+     * @return string timezone.              
+     */
+        getTimeZone: function() {
+           var dt = this.getProperty('DTSTART');
+           return dt.get('TZID');
+        },
+    /**
+     * Get rules for event.
+     * @return PropertyMap of rules.              
+     */
+        getRuleProperties: function() {
+            var r;
+            try {
+              var r = this.getProperty('RRULE');
+            } catch(e) {
+              r = new PropertyMap();
+            }
+            return r;
+        },
+    /**
+     * Get a property by name.
+     * @input string property
+     * @return property value.
+     * @throws invalidPropertyException.         
+     */     
+        getProperty: function(property) {  
+          try {
+            return this.removeSlashes(this.properties.get(property));      
+          } catch(e) {
+            throw(e); 
+          }
+        },
+    /**
+     * Sets a property with given name and value.
+     * @input string property name.
+     * @input object value.              
+     */
+        setProperty: function(property, value) {
+            if(typeof(property) == 'string' && property != null && property != '') {
+              this.properties.put(property, value);
+            } else {
+              throw('invalidKeyNameException');
+            }
+        },
+    /**
+     * Get property with given key in HTML-format.
+     * @input string property name.       
+     * @return HTML-string.       
+     */
+        getHtmlValue: function(property) {
+          prop = this.removeSlashes(this.properties.get(property));
+          if(typeof(prop) == 'string') {
+            prop = prop.replace('\n','<br/>', 'g');
+            return prop; 
+          } else {
+            return prop;
+          }                    
+        },
+    /**
+     * Get a list of property- names for this event.
+     * @return array of strings.       
+     */     
+        getPropertyNames: function() {
+          return this.properties.keys();
+        },
+    /**
+     * Removes slashes from a string
+     * @input string.       
+     * @return fixed string.       
+     */  
+        removeSlashes: function(str) {
+            if(typeof(str) == 'string') {
+              str = str.replace('\\n','\n', 'g');
+              str = str.replace('\\,','\,', 'g');
+              str = str.replace('\\;','\;', 'g');
+            }    
+            return str;
+        }  
+  }
+
+/**
+ * Hashmap class to hold properties
+ * for calendar and events.   
+ */ 
+function PropertyMap()  {   
+  this.size = 0;   
+  this.properties = new Object();
+}
+
+  // Class methods
+  
+  PropertyMap.prototype = {
+    /**
+     * Add or update property.
+     */            
+        put: function(key, value) {   
+          if(!this.containsKey(key)) {   
+              this.size++ ;   
+          }   
+          this.properties[key] = value;   
+        },   
+    /**
+     * Get property with given key.
+     * @input property name.     
+     * @return object.
+     * @throws invalidPropertyException.
+     */            
+        get: function(key) {
+          if(this.containsKey(key)) {
+            return this.properties[key];
+          } else {
+            throw('invalidPropertyException');
+          }   
+        },
+    /**
+     * Alias for get method to keep consistancy in syntax in regard to the other classes.
+     * @input property name.     
+     * @return object.
+     * @throws invalidPropertyException.
+     */            
+        getProperty: function(key) {
+          try {
+            return this.get(key);
+          } catch(e) {
+            throw(e);
+          }
+        },
+    /**
+     * Remove property with key.
+     */
+        remove: function(key) {   
+          if( this.containsKey(key) && (delete this.properties[key])) {   
+              size--;   
+          } 
+        },   
+    /**
+     * Check if a property exists.
+     */
+        containsKey: function(key) {   
+          return (key in this.properties);   
+        },    
+    /**
+     * Check if a value exists.
+     * @return boolean.     
+     */
+        containsValue: function(value) {   
+          for(var prop in this.properties) {   
+              if(this.properties[prop] == value) {   
+                  return true; 
+              }   
+          }   
+          return false;   
+        },   
+    /**
+     * Get all the values.
+     * @return array of values.     
+     */
+        values: function () {   
+          var values = new Array();   
+          for(var prop in this.properties) {   
+              values.push(this.properties[prop]);   
+          }   
+          return values;   
+        },
+    /**
+     * Get all the keys.
+     * @return array of keys.     
+     */
+        keys: function () {   
+          var keys = new Array();   
+          for(var prop in this.properties) {   
+              keys.push(prop);   
+          }   
+          return keys;   
+        },
+    /**
+     * Get the size of map.
+     * @return int size.     
+     */
+        size: function () {   
+          return this.size;   
+        },   
+    /**
+     * Clears all properties.
+     */
+        clear: function () {   
+          this.size = 0;   
+          this.properties = new Object();   
+        },
+    /**
+     * Gives a string representation of this propertymap.
+     */         
+        toString: function() {
+            var str = '';
+            for(var prop in this.properties) {   
+                str += prop+'='+this.get(prop)+', ';   
+            }        
+            return '{ '+str.substring(0,(str.length-2))+' }'; 
+        }
+}   
+/*************** END iCalReader.js ******************************************************************************/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/index.html	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,15 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title></title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />		
+        <script type="text/javascript" src="WRTKit/WRTKit.js"></script>
+        <script type="text/javascript" src="Main.js"></script>
+        <script type="text/javascript" src="iCalReader.js"></script>
+        <link rel="stylesheet" href="oscon.css" type="text/css">
+        <META NAME="Generator" CONTENT="Nokia WRT plug-in for Aptana Studio 2.0.0" />
+    </head>
+    <body onload="init()">
+	</body>
+</html>
\ No newline at end of file
Binary file OSCON/logo.png has changed
Binary file OSCON/oscon-home.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/oscon.css	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,33 @@
+/* Feed item date */
+.FeedItemDate {
+    font-style: italic;
+}
+
+/* Feed item text */
+.FeedItemDescription {
+    padding: 4px 0px;
+}
+
+/* Feed item links */
+.FeedItemLink {
+    font-weight: bold;
+}
+
+/* Anchor tags in the context of a feed item link */
+.FeedItemLink a {
+    text-decoration: underline;
+    font-weight: bold;
+    color: rgb(255,255,255);
+}
+
+/* Focused anchor tags */
+.FeedItemLink a:focus {
+    background: rgb(65,131,68);
+    color: rgb(255,255,255);
+}
+
+/* Focused anchor tags */
+.FeedItemLink a:hover {
+    background: rgb(65,100,68);
+    color: rgb(255,255,255);
+}
Binary file OSCON/session.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/test.html	Fri Jul 17 15:52:45 2009 -0700
@@ -0,0 +1,12 @@
+<html>
+<body>
+<script language="JavaScript">
+function function1() {
+   var myElement = document.createElement('<div style="width:300; height:200;background-color:blue;"></div>');
+   document.all.myDiv.insertBefore(myElement); 
+} 
+</script>
+<button id="myButton" onclick="function1();">Insert element</button>
+<div id="myDiv" style="width:300; height:200;"></div>
+</body>
+</html>
\ No newline at end of file