var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}

function sendRequest(url,callback,postData) {
	var req = createXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url,true);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	req.onreadystatechange = function () {
		if (req.readyState != 4) return;
		if (req.status != 200 && req.status != 304) {
			return;
		}
		
		callback(req);
	}
	
	if (req.readyState == 4) return;
	req.send(postData);
}


function CalTime (date, isDay) {
  this.date = date;
  this.isDay = isDay;
}

function formatGCalTime(gCalTime) { 
  // regex for parsing dates/times in xs:date format 
  // This is generally like: 2005-06-06T18:00:00-08:00
  var re = /^(\d{4})\-?(\d{2})\-?(\d{2})(T(\d{2})\:?(\d{2})\:?(\d{2})(\.\d{3})?(Z$|([\+\-])(\d{2})\:?(\d{2})))?/;
  var dtParsed = re.exec(gCalTime);
  var year = Number(dtParsed[1]);
  var month = Number(dtParsed[2]);
  var dateMonth = Number(dtParsed[3]);
  var hours = 0;
  var mins = 0;
  var correctionMinutes = 0;
  var dateString;
  // if a DATE-TIME was matched in the regex 
  if (typeof dtParsed[4] != "undefined") {
    hours = dtParsed[5];
    mins = dtParsed[6];
    // if time from server is not already in GMT, calculate offset
    if (dtParsed[9] != "Z") {
      correctionMinutes = (dtParsed[10]=="+" ? -1 : 1) * (Number(dtParsed[11])*60 + 
	  (typeof dtParsed[12] == "undefined" ? 0 : Number(dtParsed[12])));
    } 
    // get time since epoch and apply correction, if necessary
    // relies upon Date object to convert the GMT time to the local
    // timezone
    var originalDateEpoch = Date.UTC(year,month-1,dateMonth,hours,mins);
    var gmtDateEpoch = originalDateEpoch + correctionMinutes*1000*60;
    var ld = new Date(gmtDateEpoch);
    return new CalTime (ld, false);

  } else {
    return new CalTime (new Date (year,month-1,dateMonth), true);
  }
  return dateString;
}

function GCalEvent(startTime, endTime, link, title, where, content) {
    this.StartTime = startTime;
    this.EndTime = endTime;
    this.Link = link;
    this.Title = title;
	this.Where = where;
	this.Content = content;
}

function sortByTime(a, b) {
	var x, y;
    if (a.StartTime == b.StartTime)
	{
		x = a.EndTime
		y = b.EndTime
	}
	else
	{
		x = a.StartTime
		y = b.StartTime
	}

    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

function insertEventsToArray(RSSRequestObject, gCalEvents) 
{
	var title = false;
	// If data received correctly
	if (RSSRequestObject.readyState==4) {	
		// if data is valid
		if (RSSRequestObject.responseText.indexOf('Warning') != -1) return false;
		if (RSSRequestObject.responseText.indexOf('invalid') == -1) 
		{ 	
			var node = RSSRequestObject.responseXML.documentElement; 
			title = node.getElementsByTagName('title').item(0).firstChild.data;
			
			// Browse events
			var items = node.getElementsByTagName('entry');
			var index = 0;
			for (var n=items.length-1; n >= 0; n--)
			{
				var itemTitle = items[n].getElementsByTagName('title').item(0).firstChild.data;
				var itemLink = items[n].getElementsByTagName('link');
				for (var z=itemLink.length-1; z >= 0; z--)
				{
					if (itemLink[z].getAttribute("type") == "text/html")
					{
						itemLink = itemLink[z].getAttribute("href");
						break;
					}							
				}
				if (z < 0)	itemLink = '';
				var itemWhere = items[n].getElementsByTagName('gd:where');
				if (itemWhere.length < 1)
					itemWhere = items[n].getElementsByTagName('where');					
				itemWhere = itemWhere.item(0).getAttribute("valueString");
				if (!itemWhere) 
					itemWhere = '';

				if (itemWhere.indexOf('http://') == 0)
					itemLink = itemWhere;
				else
					itemLink = false;
								
				var itemContent = items[n].getElementsByTagName('content').item(0).text;


				var itemDates = items[n].getElementsByTagName('gd:when');
				if (itemDates.length < 1)
					itemDates = items[n].getElementsByTagName('when');
					
				for (var z=itemDates.length-1; z >= 0; z--)
				{
					var startTime = formatGCalTime(itemDates[z].getAttribute("startTime")).date;
					var endTime = formatGCalTime(itemDates[z].getAttribute("endTime")).date;
					gCalEvents[index++] = new GCalEvent(startTime, endTime, itemLink, itemTitle, itemWhere, itemContent);							 							
				}						
			}							
		}
		else 
		{
			return false;
		}	
	}
	
	return title;	
}

