See09/schedule.js
changeset 19 f3521a11d878
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/schedule.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,173 @@
+// ////////////////////////////////////////////////////////////////////////////
+// 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 Schedule class is used to load, keep and filter sessions   
+function Schedule() {
+	this.callBackFunction = null;
+	this.sessions = null;
+	this.topics = new Array( "Main Stage", "Application Development", "Open Source Business Models", "Device Creation and Contributing to Symbian", "Hands-on Lab 1", "Hands-on Lab 2", "Birds of a Feather" );
+	this.scheduleFileName = null;
+	this.http = null;
+	this.parseCounter = 0;
+	this.rawData = null;
+}
+
+// Kick off loading
+Schedule.prototype.Init = function(csvfile, cbfunc){
+	this.callBackFunction = cbfunc;
+	this.scheduleFileName = csvfile;
+	var self = this;
+	setTimeout( function() {self.Load();}, 100);
+}
+
+// 'public' functions 
+Schedule.prototype.GetTopics = function() {
+	return this.topics;
+}
+
+Schedule.prototype.GetSessions = function(topic, day) {
+	var cnt = this.sessions.length;
+	var ret = new Array();
+	for( var i = 0; i < cnt ; i++ ) {
+		var session = this.sessions[i];
+		if ( session.topic == topic && day == session.date ) {
+			ret.push(session);
+		}
+	}
+	return ret;
+}
+
+Schedule.prototype.GetCurrentSessions = function() {
+	var now = GetUtcTime(new Date());
+	if ( ! this.sessions || this.sessions == null ) {
+		return;
+	}
+	var cnt = this.sessions.length;
+	var ret = new Array();
+	for( var i = 0; i < cnt ; i++ ) {
+		var session = this.sessions[i];
+		var sessionStart = session.GetStartUtc();
+		var sessionEnd = session.GetEndUtc();
+		if( now > sessionStart && now < sessionEnd ) {
+			ret.push(session);
+		}
+	}
+	return ret;
+}
+
+
+// 'private' functions
+
+// Loading and parsing
+Schedule.prototype.Load = function(){
+	// Prepare asynchronous download
+	this.http = new Ajax();
+	var self = this;
+	this.http.onreadystatechange = function() { self.LoadComplete(); };
+	this.http.open("GET", this.scheduleFileName, true); // false means synchronous
+	this.http.send(null);
+}
+	
+Schedule.prototype.LoadComplete = function() {
+	// request complete?
+    if (this.http.readyState == 4) {
+		try {
+			this.rawData = this.http.responseText;
+			this.http = null; 
+			// parse data
+			this.sessions = new Array();
+			this.Parse(); // Prepare and set the data for the parser.
+		} 
+		catch (x) {
+			uiManager.showNotification(5000, "warning", "Error processing feed");
+		}
+	}
+}
+
+Schedule.prototype.Parse = function() {
+	var session = new Session();
+	var fieldCounter = 0;
+	var fieldBuf = "";
+	var quoted = false;
+	for(; this.parseCounter < this.rawData.length; this.parseCounter++ ) {
+		var ch = this.rawData.charAt(this.parseCounter);
+		if ( !quoted && ( ch == ',' || ch == '\n') ) {
+			session.SetFieldByOrdinal(fieldCounter++, fieldBuf);
+			if (fieldCounter == session.GetNumberOfFields()) {
+				this.AddSession(session);
+				this.parseCounter++;
+				var self = this;
+				setTimeout(function(){self.Parse();}, 1);
+				return;
+			}
+			fieldBuf = "";
+		} else if ( ch == '"' ) {
+			if (quoted) {
+				if (this.parseCounter < this.rawData.length - 1 && this.rawData.charAt(this.parseCounter + 1) == '"') {
+					// escaped quote, ignore this and next
+					this.parseCounter++;
+				} else {
+					quoted = false;
+				}
+			} else {
+				quoted = true;
+			}
+		} else if ( ch == '\r' ) {
+			// ignore carriage return 
+		} else if ( ch == '\n' ) { // quoted = true
+			// replace newline with <br> 
+			fieldBuf += "<br>";
+		} else {
+			fieldBuf += ch;
+		}
+	}
+	this.Sort();
+	if (this.callBackFunction) {
+		this.callBackFunction.call();
+	}
+	uiManager.hideNotification();
+}
+
+Schedule.prototype.Sort = function (){
+	// we get the schedule all messy so here we sort things out
+	var cnt = this.sessions.length;
+	for( var i = 0 ; i < cnt ; i++ ) {
+		for( var j = i+1 ; j < cnt ; j++ ) {
+			var si = this.sessions[i];
+			var sj = this.sessions[j];
+			if ( si.startTime > sj.startTime ) {
+				// swap
+				this.sessions[i] = sj;
+				this.sessions[j] = si;
+			}
+		}	 
+	}	 
+}
+
+Schedule.prototype.AddSession = function (session) {
+	if ( ! session.topic || session.topic == null || session.topic.length == 0 ) {
+		return;
+	}
+	// add to list of sessions
+	this.sessions.push(session);
+}
+
+function trim(text) {
+	return text;
+}
+
+
+function GetUtcTime(d){
+	// convert to msec since Jan 1 1970
+	var localTime = d.getTime();
+	// obtain local UTC offset and convert to msec
+	var localOffset = d.getTimezoneOffset() * 60000;
+	// obtain UTC time in msec
+	return localTime + localOffset;
+}
\ No newline at end of file