/** * Javascript ical Parser * Proof of concept method of reading icalendar (.ics) files with javascript. * * @author: Carl Saggs * @source: https://github.com/thybag/ * @version: 0.2 */ function ical_parser(feed_url, callback){ //store of unproccesed data. this.raw_data = null; //Store of proccessed data. this.events = []; /** * loadFile * Using AJAX to load the requested .ics file, passing it to the callback when completed. * @param url URL of .ics file * @param callback Function to call on completion. */ this.loadFile = function(url, callback){ //Create request object try {xmlhttp = window.XMLHttpRequest?new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP");} catch (e) { } //Grab file xmlhttp.onreadystatechange = function(){ if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) { //On success, run callback. callback(xmlhttp.responseText); } } xmlhttp.open("GET", url, true); xmlhttp.send(null); } /** * makeDate * Convert the dateformat used by ICalendar in to one more suitable for javascript. * @param String ical_date * @return dt object, includes javascript Date + day name, hour/minutes/day/month/year etc. */ this.makeDate = function(ical_date){ //break date apart var dt = { year: ical_date.substr(0,4), month: ical_date.substr(4,2), day: ical_date.substr(6,2), hour: ical_date.substr(9,2), minute: ical_date.substr(11,2) } //Create JS date (months start at 0 in JS - don't ask) dt.date = new Date(dt.year, (dt.month-1), dt.day, dt.hour, dt.minute); //Get the full name of the given day dt.dayname =["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][dt.date.getDay()]; return dt; } /** * parseICAL * Convert the ICAL format in to a number of javascript objects (Each representing a date) * * @param data Raw ICAL data */ this.parseICAL = function(data){ //Ensure cal is empty this.events = []; //Clean string and split the file so we can handle it (line by line) cal_array = data.replace(new RegExp( "\\r", "g" ), "").split("\n"); //Keep track of when we are activly parsing an event var in_event = false; //Use as a holder for the current event being proccessed. var cur_event = null; for(var i=0;i current_date) future_events.push(itm); }); return future_events; } /** * load * load a new ICAL file. * * @param ical file url */ this.load = function(ical_file){ var tmp_this = this; this.raw_data = null; this.loadFile(ical_file, function(data){ //if the file loads, store the data and invoke the parser tmp_this.raw_data = data; tmp_this.parseICAL(data); }); } //Store this so we can use it in the callback from the load function. var tmp_this = this; //Store the feed url this.feed_url = feed_url; //Load the file this.load(this.feed_url); }