var theService;
var feedUrl = "http://www.google.com/calendar/feeds/thirstwinemerchants@gmail.com/public/full";

google.load("gdata", "1");
google.setOnLoadCallback(feedCallback);
function serviceInit() {
  theService = new google.gdata.calendar.CalendarService('calRequest1');
}
function feedCallback() {
  serviceInit();
  theService.getEventsFeed(feedUrl, feedHandle, errorHandle);
}
function feedHandle(feedRoot) {
  feed_title = feedRoot.feed.getTitle().getText();
   
  entries = feedRoot.feed.entry;
  listContents = new Array();

  for (idx = 0; idx < entries.length; idx++) {
	var entry = entries[idx];
	var title = entry.title.$t;

 	var start = entry['gd$when'][0].startTime;
	var end = entry['gd$when'][0].endTime;
	
	//if start time is later then now, then push the event into the list
	var now = new Date();
	//console.log(start);
	//console.log(fromISO8601(start));
	
	if (fromISO8601(start) >= now) {
		var content = entry.content.$t;
		ob = setCalendarEventList(title, start, end, content);
		listContents[ob.id] = ob.content;
	} else {
		continue;
	}
  }
  html = sortDisplayPanel(listContents).join('');

  $('#calendar-event-list').html(html);
  $('.title-link').click(function() {
	selector = '#CONTENT-'+ this.rel;
	$(selector).slideToggle('fast');
	return false;
  });
}
function errorHandle(error) {
  // alert('Calendar feed error'+ (error.cause ? error.cause.statusText : error.message));
}

function sortDisplayPanel(panels) {
  ret = new Array();
  keys = new Array();
  for (v in panels) {
	keys.push(v);
  }
  keys.sort(function (a,b) {
	if (a == b) return false;
	if (a > b) return true;
	if (a < b) return false;
  });
  for (ix = 0; ix < keys.length; ix++) {
	idx = keys[ix];
	ret.push(panels[idx]);
  }
  return ret;
}

function parseDateObject(timeObj, format) {
  date = new Date();
  date_regex = /^([0-9]{4}).([0-9]{2}).([0-9]{2})$/;
  date_full_regex = /^([0-9]{4}).([0-9]{2}).([0-9]{2}).([0-9]{2}):([0-9]{2}).+/;
  if (timeObj.match(date_regex)) {
	timeObj = timeObj +'T00:00:00.000-04:00';
  }

  year = timeObj.replace(date_full_regex, '$1');
  month = timeObj.replace(date_full_regex, '$2');
  day = timeObj.replace(date_full_regex, '$3');
  hour = timeObj.replace(date_full_regex, '$4');
  min = timeObj.replace(date_full_regex, '$5');
  date = new Date(year, month, day, hour, min);

  if (format == null) {
	return date;
  }

  try {
	return date.toLocaleFormat(format);
  } 
  catch (e) {
	date = new Date();
	date.setFullYear(year);
	date.setMonth(month);
	date.setDate(day);
	date.setHours(hour);
	date.setMinutes(min);
	if (format == '%b %d, %Y') {
	  return dateFormat(date, "mmm d, yyyy");
	}
	else if (format == '%l') {
	  return dateFormat(date, "h");
	}
	else {
	  return dateFormat(date, "hTT");
	}
  }
}

function setCalendarEventList(title, start_string, end_string, content) {
	/*
	start = parseDateObject(start_string, "%b %d, %Y");
	start_time = parseDateObject(start_string, "%l");
	end = parseDateObject(end_string, "%b %d, %Y");
	end_time = parseDateObject(end_string, "%l%p");
	sort = parseDateObject(end_string, null);
	*/
	start = fromISO8601(start_string);
	end = fromISO8601(end_string);
	sort = parseDateObject(end_string,null);


	key = calcSHA1(title + content + start);

	current = '<div id="'+ sort.getTime() +'" class="event-list-entry">'
		+'<div id="DATE-'+ key +'" class="start-date">'
		+'<div class="date"><a href="#" rel="'+ key +'" class="title-link">'+ dateFormat(start,"mmm dd, yyyy") +'</a></div>'
		+'<div class="time"><a href="#" rel="'+ key +'" class="title-link">'+ dateFormat(start, "h:MM TT") +' - '+ dateFormat(end, "h:MM TT") +'</a></div>'
		+'<div id="TITLE-'+ key +'" class="title"><a href="#" rel="'+ key +'" class="title-link">'+ title +'</a></div>'
		+'</div>'
		+'<div class="content" id="CONTENT-'+ key +'">'
		// +'<div clas="full-date"><span class="start">'+ start +'</span><span class="end">'+ end +'</div>'
		+ content 
		+'</div>'
		+'</div>';

	ret = new Object();
	ret.id = sort.getTime();
	ret.content = current;

	return ret;
}


/*
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
* in FIPS PUB 180-1
* Copyright (C) Paul Johnston 2000 - 2002.
* See http://pajhome.org.uk/site/legal.html for details.
*/

/*
* Convert a 32-bit number to a hex string with ms-byte first
*/

// alert("loading SHA1 ...");


var hex_chr = "0123456789abcdef";
function hex(num)
{
var str = "";
for(var j = 7; j >= 0; j--)
str += hex_chr.charAt((num >> (j * 4)) & 0x0F);
return str;
}

/*
* Convert a string to a sequence of 16-word blocks, stored as an array.
* Append padding bits and the length, as described in the SHA1 standard.
*/
function str2blks_SHA1(str)
{
var nblk = ((str.length + 8) >> 6) + 1;
var blks = new Array(nblk * 16);
for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
for(var i = 0; i < str.length; i++)
blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8);
blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8);
blks[nblk * 16 - 1] = str.length * 8;
return blks;
}

/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function safe_add(x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}

/*
* Bitwise rotate a 32-bit number to the left
*/
function rol(num, cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}

/*
* Perform the appropriate triplet combination function for the current
* iteration
*/
function ft(t, b, c, d)
{
if(t < 20) return (b & c) | ((~b) & d);
if(t < 40) return b ^ c ^ d;
if(t < 60) return (b & c) | (b & d) | (c & d);
return b ^ c ^ d;
}

/*
* Determine the appropriate additive constant for the current iteration
*/
function kt(t)
{
return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
	 (t < 60) ? -1894007588 : -899497514;
}

/*
* Take a string and return the hex representation of its SHA-1.
*/
function calcSHA1(str)
{
// alert("calcSHA1");

var x = str2blks_SHA1(str);
var w = new Array(80);

var a =  1732584193;
var b = -271733879;
var c = -1732584194;
var d =  271733878;
var e = -1009589776;

for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
var olde = e;

for(var j = 0; j < 80; j++)
{
  if(j < 16) w[j] = x[i + j];
  else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
  var t = safe_add(safe_add(rol(a, 5), ft(j, b, c, d)), safe_add(safe_add(e, w[j]), kt(j)));
  e = d;
  d = c;
  c = rol(b, 30);
  b = a;
  a = t;
}

a = safe_add(a, olda);
b = safe_add(b, oldb);
c = safe_add(c, oldc);
d = safe_add(d, oldd);
e = safe_add(e, olde);
}
return hex(a) + hex(b) + hex(c) + hex(d) + hex(e);
}

function fromISO8601(dString){
	var regexp = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)(:)?(\d\d)(\.\d+)?(Z|([+-])(\d\d)(:)?(\d\d))/;
	 
	var dt = new Date();
	
	if (dString.toString().match(new RegExp(regexp))) {
		var d = dString.match(new RegExp(regexp));
		var offset = 0;
		 
		dt.setUTCDate(1);
		dt.setUTCFullYear(parseInt(d[1],10));
		dt.setUTCMonth(parseInt(d[3],10) - 1);
		dt.setUTCDate(parseInt(d[5],10));
		dt.setUTCHours(parseInt(d[7],10));
		dt.setUTCMinutes(parseInt(d[9],10));
		dt.setUTCSeconds(parseInt(d[11],10));
		
		if (d[12]) {
			dt.setUTCMilliseconds(parseFloat(d[12]) * 1000);
		} else {
			dt.setUTCMilliseconds(0);
		}
		if (d[13] != 'Z') {
			offset = (d[15] * 60) + parseInt(d[17],10);
			offset *= ((d[14] == '-') ? -1 : 1);
			dt.setTime(dt.getTime() - offset * 60 * 1000);
		}
	} else {
		dt.setTime(Date.parse(dString));
	}
	return dt;
};

