OSCON/Main.js
changeset 11 aaba47256eea
parent 7 97dcd250e5be
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCON/Main.js	Tue Jul 21 12:22:37 2009 +0100
@@ -0,0 +1,329 @@
+// ////////////////////////////////////////////////////////////////////////////
+// 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 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.show();
+	mainView.previousView = null;	
+	uiManager.showNotification(-1, "wait", "Please wait...", -1);
+	setTimeout(function(){	uiManager.hideNotification();mainView.show();}, 1000);
+}
+
+
+function showDay(dayIndex, date) {
+	downloadDayIndex = dayIndex;
+	if ( icalReader[dayIndex] == null ) {
+		setTimeout(function(){	downloadIcalData(downloadDayIndex);}, 100);
+	} else {
+		showList(date, null);
+	}
+}
+
+function downloadIcalData(dayIndex) {
+	downloadDayIndex = dayIndex;
+
+	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;
+	mainView.previousView = null;
+	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 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");
+    }
+}
+