/*
File: JavaScript functions file to be used with the WPNG Calendar plugin for Wordpress
Plugin URI: http://code.google.com/p/wpng-calendar/

----------------------------------------------------------------------------
LICENSE
----------------------------------------------------------------------------
Copyright 2008  - L1 Jockeys  (email : l1jockeys@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
----------------------------------------------------------------------------
*/

$j=jQuery.noConflict();

/* Loads the Google data API */
google.load("gdata", "1");

/* Loads the Google map API */
//google.load("maps", "2");

/* Set global variables to store the dates being processed */
var firstDate = null;
var lastDate = null;
var geocoder = null;
var entryMap = null;
var iDate = Date.today();
var iDay = 0;

/**
 * Init the Google data JS client library with an error handler 
 */
function init() {
  /* initialize the error handler */
  google.gdata.client.init(handleGDError);
  /* initialize the Geocoder */
  //geocoder = new GClientGeocoder();
}

/**
 * Setup the Google Calendar service
 */
function setupCalendarService() {
  var calService = new google.gdata.calendar.CalendarService('wpng-calendar-plugin-1');
  return calService;
}

/**
 * Wrapper to pull more entries from the calendar for later dates.
 */
 function getLaterEntries() { 
  /* increment the date by one day before incrementing by the weeks interval */
  lastDate.add(1).days();
  var start = lastDate.clone();
  var end   = lastDate.clone().add(weeks).weeks();
  /* call the loadCalendar function with the new dates) */
  loadCalendar(start,end);
 }
 
/**
 * Wrapper to pull more entries from the calendar for older dates.
 */
 function getOlderEntries() { 
  /* decrement the date by one day before decrementing by the weeks interval */
  firstDate.add(-1).days();
  var end   = firstDate.clone();
  var start = firstDate.clone().add(-1 * weeks).weeks();
  /* call the loadCalendar function with the new dates) */
  loadCalendar(start,end);
 }

/**
 * Wrapper to query the calendar for dates from current through a number of weeks
 */  
function loadCalendarByWeeks() {
  /* default to current date */
  var start = Date.today();
  var end   = Date.today().add(weeks).weeks();
  loadCalendar(start, end);
}

function setUrl(iUrl) {
	var url_match = /https?:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\/\S*)?/;
	if(iUrl.substr(0,4)=="http"){
		/*nel caso si volesse verificare il link in maniera pių complessa e passandolo sapendo che č un link*/
		/*if(iUrl.substr(0,7)!="http://"){
			iUrl = "http://"+iUrl;
		}
		
		if(url_match.test(iUrl)){
			return iUrl;
		}else{
			return baseUrl;
		}*/
		
		if(url_match.test(iUrl)){
			return true;
		}else{
			return false;
		}
	}
}
/**
 * Uses Google data JS client library to retrieve a calendar entry from the specified
 * URI.
 *
 * @param {string} entryURI is the URI for the specific entry
 */  
function loadCalendarEntry(entryURI) {
  var service = setupCalendarService();
  service.getEventsEntry(entryURI, listEntry, handleGDError);
}
 
/**
 * Uses Google data JS client library to retrieve a calendar feed from the specified
 * URL.  The feed is controlled by several query parameters and a callback 
 * function is called to process the feed results.
 *
 * @param {start}  start date (JavaScript)
 *        {end}    end date   (JavaScript)
 */  
function loadCalendar(start, end) {
  /*start=new Date (2010, 0, 1);
  end=new Date (2010, 6, 1);*/
  var service = setupCalendarService();
  var query = new google.gdata.calendar.CalendarEventQuery(calendarURL);
  /* general query settings */
  query.setOrderBy('starttime');
  query.setSortOrder('ascending');
  query.setSingleEvents(true);
  /* pageMaxResults is set dynamically from wpng-calendar.php -> addWPNGSettings */
  query.setMaxResults(pageMaxResults);
  /* convert JS dates to Google GData DateTime */
  var startDateTime = new google.gdata.DateTime(start);
  var endDateTime = new google.gdata.DateTime(end);
  query.setMinimumStartTime(startDateTime);
  query.setMaximumStartTime(endDateTime);

  service.getEventsFeed(query, listEvents, handleGDError);
}

/**
 * Uses Google data JS client library to retrieve a calendar
 * URL.  The feed is controlled by several query parameters and a callback 
 * function is called to process the feed results.
 */  
function loadShowCalendar(iaction) {
 var service = setupCalendarService();
  var query = new google.gdata.calendar.CalendarEventQuery(calendarURL);
  /* general query settings */
  query.setOrderBy('starttime');
  query.setSortOrder('ascending');
  query.setSingleEvents(true);
  /* pageMaxResults is set dynamically from wpng-calendar.php -> addWPNGSettings */
  // query.setMaxResults(pageMaxResults);
  /* convert JS dates to Google GData DateTime */
  /*if the day is not setted*/
  var startDate = "";
  var endDate = "";
  /*add one day to date to show events from google*/
  if(iaction=="prev"){
    iDate = iDate.addMonths(-1)
  }else if(iaction=="next"){
    iDate = iDate.addMonths(+1)
  }
  startDate = Date.parse(iDate.toString('M')+',1,'+iDate.toString('yyyy'));
  endDate = Date.parse(iDate.toString('M')+','+Date.getDaysInMonth(iDate.toString('yyyy'), iDate.getMonth())+','+iDate.toString('yyyy'));
  iDate = startDate;
  var startDateTime = new google.gdata.DateTime(startDate);
  var endDateTime = new google.gdata.DateTime(endDate);
  query.setMinimumStartTime(startDateTime);
  query.setMaximumStartTime(endDateTime);

  service.getEventsFeed(query, showCalendar, handleGDError);
}

/**
 * Uses Google data JS client library to retrieve a calendar feed from the specified
 * URL.  The feed is controlled by several query parameters and a callback 
 * function is called to process the feed results.
 *
 * @param {size}  # of events to list (JavaScript)
 */  
function loadCalendarWidget(iday) {
  var service = setupCalendarService();
  var query = new google.gdata.calendar.CalendarEventQuery(calendarURL);
  /* general query settings */
  query.setOrderBy('starttime');
  query.setSortOrder('ascending');
  query.setSingleEvents(true);
  query.setMaxResults(widgetListSize);
  /* convert JS dates to Google GData DateTime */
  var startDate = "";
  var endDate = "";
  if(iday==undefined){
	  iday = Date.today();
	  if(iDate.toString('M')==iday.toString('M')){
		  startDate = Date.parse(iDate.toString('M')+','+iday.toString('dd')+','+iDate.toString('yyyy'));
	  }else{
		  startDate = Date.parse(iDate.toString('M')+',1,'+iDate.toString('yyyy'));
	  }
	  endDate = Date.parse(Date.parse(iDate.toString('M')+','+Date.getDaysInMonth(iDate.toString('yyyy'), iDate.getMonth())+','+iDate.toString('yyyy')));
	  iDay=0;
  }else{
	  startDate = Date.parse(iDate.toString('M')+','+iday+','+iDate.toString('yyyy'));
	  endDate = startDate.clone().add(1).days();
	  iDay=iday;
  }
  var startDateTime = new google.gdata.DateTime(startDate);
  var endDateTime = new google.gdata.DateTime(endDate);
  query.setMinimumStartTime(startDateTime);
  query.setMaximumStartTime(endDateTime);

  service.getEventsFeed(query, listWidgetEvents, handleGDError);
}

/**
 * Callback function for the Google data JS client library to call with a feed 
 * of events retrieved.
 *
 * Creates a list of events in a human-readable form.  This list of
 * events is added into a div called 'wpng-cal-events'.  
 *
 * @param {json} feedRoot is the root of the feed, containing all entries 
 */ 
function showCalendar(feedRoot) {
  var entries = feedRoot.feed.getEntries();
  var eventDiv = document.getElementById('wpng-cal-widget-calendar');
  // these are labels for the days of the week
  var cal_days_labels = ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa'];
 
  // do the header
  /* clear out anything in the current events DIV */
  while (eventDiv.firstChild) {
	  eventDiv.removeChild(eventDiv.firstChild);
  }
  
  /*Compilo un array contenente le date degli eventi*/
  var len = entries.length;
  //var eventTest = document.getElementById('wpng-cal-widget-test');
  var aryDays = [];
  for (var i = 0; i < len; i++) {
	  /*recuperro i valori dai dati di google calendar e li inserisco in un array*/
	  var entry = entries[i];
	  var times = entry.getTimes();
	  var startTime = times[0].getStartTime();
	  var displayTime = startTime.getDate().clone();
	  var dateString = null;
	  dateString = displayTime.toString('d');
	  aryDays.push(dateString);
  }
	  
  // get first day of month
  var dDate = Date.parse(iDate);
  //dDate = new Date(dDate.getFullYear(), iMonth ,1);
  var startingDay = dDate.getDay();
  
  // find number of days in month
  var monthLength = Date.getDaysInMonth(dDate.toString('yyyy'), dDate.getMonth()); 
   
  /*creo la tabella tramite DOM*/
  var table = document.createElement('table');
  table.setAttribute('id','calendar-table');
  table.setAttribute('cellpadding','0');
  table.setAttribute('cellspacing','0');
  table.setAttribute('border','0');
  /*creo l'header della tabella*/
  var tableCaption = document.createElement('caption');
  tableCaption.setAttribute('id','calendar-caption');
  /*var tableHead = document.createElement('caption');
  tableHead.setAttribute('id','calendar-caption');
  var trHead = document.createElement('tr');
  var tdHead = document.createElement('th');
  tdHead.setAttribute('colSpan','7');*/
  if($j.browser.msie && $j.browser.version<=7){	  
	  //inserisco dei bottoni di navigazione per i mesi
	  var prevImage = document.createElement('img');
	  var nextImage = document.createElement('img');
	  prevImage.setAttribute('src','wp-content/plugins/isayblog-calendar/images/spacer.gif');  
	  prevImage.setAttribute('class','nav-left');  
	  prevImage.setAttribute('id','isc-nav-left');  
	  jQuery(prevImage).css({"float":"left", "background":"transparent url(\"wp-content/plugins/isayblog-calendar/images/arrow-left-on.png\") no-repeat scroll left top", "margin": "1px 0 0 2px"});  	
	  //prevImage.setAttribute('id','prev');  
	  $j(prevImage).bind("click",(function (event) {
		//creo un evento click che ricarica la lista su un solo giorno
		$j("#wpng-cal-widget-calendar").css({display:"none"});
		$j("#wpng-cal-widget-events").css({display:"none"});
		$j("#wpng-cal-load-widget").css({display:"block"});			  

		loadShowCalendar('prev');
		loadCalendarWidget();
	  }));
	  tableCaption.appendChild(prevImage);
	  
	  var tabletitle = document.createElement('div');
	  tabletitle.setAttribute('id','caption-title');  
	  jQuery(tabletitle).css({"float":"left", "overflow": "hidden"});  	
	  tabletitle.appendChild(document.createTextNode(dDate.toString('MMMM') + " " + dDate.toString('yyyy')));
	  tableCaption.appendChild(tabletitle);
		
	  nextImage.setAttribute('src','wp-content/plugins/isayblog-calendar/images/spacer.gif');  
	  nextImage.setAttribute('class','nav-right');  
	  prevImage.setAttribute('id','isc-nav-right');  
	  jQuery(nextImage).css({"float":"left","background":"transparent url(\"wp-content/plugins/isayblog-calendar/images/arrow-right-on.png\") no-repeat scroll left top", "margin": "1px 2px 0 0"});  	
	  $j(nextImage).bind("click",(function (event) {
		//creo un evento click che ricarica la lista su un solo giorno
		$j("#wpng-cal-widget-calendar").css({display:"none"});
		$j("#wpng-cal-widget-events").css({display:"none"});
		$j("#wpng-cal-load-widget").css({display:"block"});			  

		loadShowCalendar('next');
		loadCalendarWidget();
	  }));
	  tableCaption.appendChild(nextImage);
  }else{
	  tableCaption.appendChild(document.createTextNode(dDate.toString('MMMM') + " " + dDate.toString('yyyy')));
	  
	  /*inserisco dei bottoni di navigazione per i mesi*/
	  var prevImage = document.createElement('img');
	  var nextImage = document.createElement('img');
	  prevImage.setAttribute('src','wp-content/plugins/isayblog-calendar/images/spacer.gif');  
	  prevImage.setAttribute('class','nav-left');  
	  jQuery(prevImage).css({"float":"left", "background":"transparent url(\"wp-content/plugins/isayblog-calendar/images/arrow-left-on.png\") no-repeat scroll left top", "margin": "1px 0 0 2px"});  	
	  //prevImage.setAttribute('id','prev');  
	  $j(prevImage).bind("click",(function (event) {
		/*creo un evento click che ricarica la lista su un solo giorno*/
		$j("#wpng-cal-widget-calendar").css({display:"none"});
		$j("#wpng-cal-widget-events").css({display:"none"});
		$j("#wpng-cal-load-widget").css({display:"block"});			  

		loadShowCalendar('prev');
		loadCalendarWidget();
	  }));
	  tableCaption.appendChild(prevImage);
		
	  nextImage.setAttribute('src','wp-content/plugins/isayblog-calendar/images/spacer.gif');  
	  nextImage.setAttribute('class','nav-right');  
	  jQuery(nextImage).css({"float":"right","background":"transparent url(\"wp-content/plugins/isayblog-calendar/images/arrow-right-on.png\") no-repeat scroll left top", "margin": "1px 2px 0 0"});  	
	  $j(nextImage).bind("click",(function (event) {
		/*creo un evento click che ricarica la lista su un solo giorno*/
		$j("#wpng-cal-widget-calendar").css({display:"none"});
		$j("#wpng-cal-widget-events").css({display:"none"});
		$j("#wpng-cal-load-widget").css({display:"block"});			  

		loadShowCalendar('next');
		loadCalendarWidget();
	  }));
	  tableCaption.appendChild(nextImage);
  }
  
  /*inserisco il tutto nel thead
  trHead.appendChild(tdHead);
  tableHead.appendChild(trHead);*/

  /*creo la riga contenente i nomi dei giorni della settimana*/
  var tableHead = document.createElement('thead');
  tableHead.setAttribute('id','calendar-day-header');
  var trDays = document.createElement('tr');
  //var tdHead = document.createElement('th');
  /*tdHead.setAttribute('colSpan','7');*/
  var trDays = document.createElement('tr');
  var thDays;
  for(var i = 0; i <= 6; i++ ){
    thDays = document.createElement('th');
    thDays.setAttribute('class', 'calendar-header-day');
    thDays.appendChild(document.createTextNode(cal_days_labels[i]));
    trDays.appendChild(thDays);
  } 
  tableHead.appendChild(trDays);

  // fill in the days
  var tableBody = document.createElement('tbody');
  var day = 1;
  var trDay;
  var tdDay;
  var currentTime = new Date()
  var iDay = currentTime.getDate()
  
  // this loop is for is weeks (rows)
  for (var i = 0; i < 9; i++) {
	trDay = document.createElement('tr');
    // this loop is for weekdays (cells)
    for (var j = 0; j <= 6; j++) { 
     tdDay = document.createElement('td');
     if (day <= monthLength && (i > 0 || j >= startingDay)) {
        tdDay.setAttribute('class', 'calendar-day');
		/*se la data risulta anche in google calendar*/
		if($j.inArray(day,aryDays)>=0){
			tdDay.setAttribute('class', 'today');
			if($j.browser.msie && $j.browser.version<=7){
				jQuery(tdDay).css({'background':'none repeat scroll 0 0 #F8F3B5', 'color':'#2F2B29', 'cursor':'pointer', 'font-weight':'bold'});
			}
			$j(tdDay).bind("click", {value: day},(function (event) {
			   /*creo un evento click che ricarica la lista su un solo giorno*/
			   $j("#wpng-cal-widget-events").css({display:"none"});
			   $j("#wpng-cal-load-widget").css({display:"block"});			  
			  
			   //alert(event.data.value);
			   loadCalendarWidget(event.data.value);
			}));
		}
		tdDay.appendChild(document.createTextNode(day));
        day++;
      }
      trDay.appendChild(tdDay);
    }
    tableBody.appendChild(trDay);
	if (day > monthLength) break;
 }
  
  /*aggiungo theader e tbody alla tabella*/
  table.appendChild(tableCaption);
  table.appendChild(tableHead);
  table.appendChild(tableBody);
  /* add the table to the event DIV */
  eventDiv.appendChild(table);


  /* Hide the loading image */
  $j("#wpng-cal-load-widget").fadeOut("fast");
  
  /* Animate the display of the list */
  if($j.browser.msie && $j.browser.version<=7){
	  $j("#wpng-cal-widget-calendar").slideDown("slow", function(){
		var iw= $j('#calendar-table').width()-46;
		$j('#caption-title').css('width', iw+'px');
	  });
  }else{
	  $j("#wpng-cal-widget-calendar").slideDown("slow");
  }
}
/**
 * Callback function for the Google data JS client library to call with a feed 
 * of events retrieved.
 *
 * Creates a list of events in a human-readable form.  This list of
 * events is added into a div called 'wpng-cal-events'.  
 *
 * @param {json} feedRoot is the root of the feed, containing all entries 
 */ 
function listEvents(feedRoot) {
  var entries = feedRoot.feed.getEntries();
  var eventDiv = document.getElementById('wpng-cal-events');
  /* clear out anything in the current events DIV */
  while (eventDiv.firstChild) {
	  eventDiv.removeChild(eventDiv.firstChild);
  }
  /* loop through the events in the feed and output to the DIV */
  var prevDateString = null;
  var len = entries.length;
  /* the list is displayed in a table, let's create it */
  var table = document.createElement('table');
  var tableBody = document.createElement('tbody');
  //table.setAttribute('className','wpng-page-list-table');
  table.setAttribute('class','wpng-page-list-table');
  for (var i = 0; i < len; i++) {
	  var entry = entries[i];
	  var times = entry.getTimes();
	  var startTime = times[0].getStartTime();
	  /* note: using cool functions from DateJS for formatting */
	  var displayTime = startTime.getDate().clone();
	  var dateString = null;
	  if (displayTime.clearTime().equals(Date.today())) {
		  dateString = 'oggi';
	  }
	  else if (displayTime.clearTime().equals(Date.today().add(1).days())) {
		  dateString = 'domani';
	  }
	  else {
		  dateString = displayTime.toString('dddd, MMMM d, yyyy');
	  }
	  /* if the date has changed then output a new header row in the table */
	  if (dateString != prevDateString) {
		  var trHead = document.createElement('tr');
		  var tdHead = document.createElement('td');
		  //tdHead.setAttribute('className','wpng-page-list-head');
		  tdHead.setAttribute('class','wpng-page-list-head');
		  tdHead.setAttribute('colSpan','2');
		  tdHead.setAttribute('colspan','2');
		  tdHead.appendChild(document.createTextNode(dateString));
		  trHead.appendChild(tdHead);
		  tableBody.appendChild(trHead);
		  prevDateString = dateString;
	  }
	  /* now display the event itself */
	  var timeString = 'Tutti gli eventi';
	  /* if the event has a time, override the default text */
	  if (!startTime.isDateOnly()) {
		  timeString = startTime.getDate().toString("h:mm tt")
	  }
	  /* create an anchor to the ThickBox remote call for the title */
	  var title = entry.getTitle().getText();
	  var uri = entry.getSelfLink().getHref();
	  var anchorTitle = document.createElement('a');
	  anchorTitle.setAttribute('href','javascript:loadCalendarEntry("' + uri + '")');
	  anchorTitle.appendChild(document.createTextNode(title));
	  
	  /* add the event time and title to the table */
	  var trEntry = document.createElement('tr');
	  var tdEntryTime = document.createElement('td');	  
	  var tdEntryTitle = document.createElement('td');	  
	  //tdEntryTime.setAttribute('className','wpng-page-list-time');
	  tdEntryTime.setAttribute('class','wpng-page-list-time');
	  //tdEntryTitle.setAttribute('className','wpng-page-list-title');
	  tdEntryTitle.setAttribute('class','wpng-page-list-title');
	  tdEntryTime.appendChild(document.createTextNode(timeString));
	  tdEntryTitle.appendChild(anchorTitle);
	  trEntry.appendChild(tdEntryTime);
	  trEntry.appendChild(tdEntryTitle);
	  tableBody.appendChild(trEntry);
	  /* get the date from the first / last entry */
	  if (i == 0) {
		  firstDate = displayTime;
	  }
	  else if (i == (len - 1)) {
	      lastDate = displayTime;
	  }
  }
  /* Append the table body to the table */
  table.appendChild(tableBody);
  
  /* if there were some events, add the table */
  if (len != 0) {
	  /* add the table to the event DIV */
	  eventDiv.appendChild(table);
  }
  else {
	  /* show a default message */
	  eventDiv.appendChild(document.createTextNode('Non ci sono altri eventi per questo mese.'));
  }
  	  
  /* at the end of the list, show the navigation links */
  if (showNav) {
	  eventDiv.appendChild(document.createElement('br'));
	  var navTable = document.createElement('table');
	  var navTableBody = document.createElement('tbody');
	  //navTable.setAttribute('className','wpng-page-list-table');
	  navTable.setAttribute('class','wpng-page-list-table');
	  var row = document.createElement('tr');
	  
	  var tdOlder = document.createElement('td');
	  var anchorOlder = document.createElement('a');
	  anchorOlder.setAttribute('href','javascript:getOlderEntries()');
	  anchorOlder.appendChild(document.createTextNode('< Mostra eventi precedenti'));
	  tdOlder.appendChild(anchorOlder);
	  row.appendChild(tdOlder);
	  
	  var tdLater = document.createElement('td');
	  tdLater.setAttribute('align','right');
	  var anchorLater = document.createElement('a');
	  anchorLater.setAttribute('href','javascript:getLaterEntries()');
	  anchorLater.appendChild(document.createTextNode('Mostra prossimi eventi >'));
	  tdLater.appendChild(anchorLater);
	  row.appendChild(tdLater);
	  
	  navTableBody.appendChild(row);
	  navTable.appendChild(navTableBody);
	  eventDiv.appendChild(navTable);
  }
  
  /* Hide the loading image */
  $j("#wpng-cal-load-page").fadeOut("fast");
  
  /* Animate the display of the list */
  $j("#wpng-cal-events").slideDown("slow");
}

/**
 * Callback function for the Google data JS client library to call with a
 * single entry retreived
 *
 * Displays an event in a human-readable form.  This event is ultimately
 * displayed in a Facebox DIV
 *
 * @param {json} retrievedEntryRoot is the root of the entry
 */ 
function listEntry(retrievedEntryRoot) {
  /* get the entry */
  var entry = retrievedEntryRoot.entry;
  
  /* build the entry display for the Thickbox */
  var entryDiv = document.createElement('div');
  entryDiv.setAttribute('id','wpng-tb');
  
  /* get the title */
  var title = document.createElement('h2');
  title.appendChild(document.createTextNode(entry.getTitle().getText()));
  title.setAttribute('class','trickH2');
  entryDiv.appendChild(title);
  
  /* display the date/time */
  var dateString = 'Tutti gli eventi';
  var times = entry.getTimes();
  if (times.length) {
	  /* if the event has a date & time, override the default text */
	  var startTime = times[0].getStartTime();
	  var endTime = times[0].getEndTime();
	  if (!startTime.isDateOnly()) {
		  dateString = startTime.getDate().toString("ddd, d MMMM, HH:mm");
	  }
	  else {
		  dateString = startTime.getDate().toString("ddd, d MMMM");
	  }
	  dateString += '   /   ';
	  if (!endTime.isDateOnly()) {
		  dateString += endTime.getDate().toString("ddd, d MMMM, HH:mm")
	  }
	  else {
		  dateString += endTime.getDate().toString("ddd, d MMMM");
	  }
  }
  var dateRow = document.createElement('div');
  //dateRow.setAttribute('className','wpng-entry-label-row');
  dateRow.setAttribute('class','wpng-entry-label-row');
  
  dateLabel = document.createElement('div');
  dateLabel.appendChild(document.createTextNode('Quando: '));
  //dateLabel.setAttribute('className','wpng-entry-label');
  dateLabel.setAttribute('class','wpng-entry-label');
  dateRow.appendChild(dateLabel);
  
  dateDisplay = document.createElement('div');
  dateDisplay.appendChild(document.createTextNode(dateString));
  //dateDisplay.setAttribute('className','wpng-entry-label-text');
  dateDisplay.setAttribute('class','wpng-entry-label-text');
  dateRow.appendChild(dateDisplay);
  
  entryDiv.appendChild(dateRow);
  
  entryDiv.appendChild(document.createElement('br'));
  //entryDiv.setAttribute('className','wpng-entry-break');
  entryDiv.setAttribute('class','wpng-entry-break');
  
  /* display the location */
  var locString = 'No location information';
  var locations = entry.getLocations();
  var locTemp = locations[0].getValueString();
  if (locTemp != null) {
	  locString = locTemp
  }
  var locRow = document.createElement('div');
  //locRow.setAttribute('className','wpng-entry-label-row');
  locRow.setAttribute('class','wpng-entry-label-row');
  
  locLabel = document.createElement('div');
  locLabel.appendChild(document.createTextNode('Dove: '));
  //locLabel.setAttribute('className','wpng-entry-label');
  locLabel.setAttribute('class','wpng-entry-label');
  locRow.appendChild(locLabel);
  
  locDisplay = document.createElement('div');
  locDisplay.appendChild(document.createTextNode(locString));
  //locDisplay.setAttribute('className','wpng-entry-label-text');
  locDisplay.setAttribute('class','wpng-entry-label-text');
  locRow.appendChild(locDisplay);
  
  entryDiv.appendChild(locRow);
  
  /* add a link to Google map the location, if something was there */
  if (locTemp != null) {
	  /* use browser sniffing to determine if IE or Opera (ugly, but required) */
	  /* thanks to => http://webbugtrack.blogspot.com/2007/10/bug-245-setattribute-style-does-not.html */
	  var isOpera = false;
	  var isIE = false;
	  var agt=navigator.userAgent.toLowerCase();
	  var appVer = navigator.appVersion.toLowerCase();
	  var iePos  = appVer.indexOf('msie');
	  if(typeof(window.opera) != 'undefined'){isOpera = true;}
	  if(!isOpera && iePos !=-1){isIE = true;};
	  
	  var locMapAnchor = document.createElement('a');
	  locMapAnchor.setAttribute('id','wpng-map-link');
	  locMapAnchor.setAttribute('href','http://maps.google.com/maps?hl=en&q=' + locString);
	  locMapAnchor.setAttribute('target','_blank');
	  if(!isIE){
		  /* use the correct DOM Method */
		  locMapAnchor.setAttribute('style','float:right;');
	  } else {
		  /* use the .cssText hack */
		  locMapAnchor.style.setAttribute('cssText', 'float:right;');
	  }
	  locMapAnchor.appendChild(document.createTextNode('Visualizza Mappa'));
	  entryDiv.appendChild(locMapAnchor);
  }
  
  entryDiv.appendChild(document.createElement('br'));
  
  /* display the description */
  var descString = 'No description';
  var tempString = entry.getContent().getText();
  if (tempString != null) {
	  descString = tempString;
  }
  var descDisplay = document.createElement('div');
  //descDisplay.setAttribute('className','wpng-entry-desc');
  descDisplay.setAttribute('class','wpng-entry-desc');
  // Translate description wikitext into HTML if the option is enabled
  if (parseWiki) {
	  var descHTML = Wiky.toHtml(descString);
	  descDisplay.innerHTML = descHTML;
  }
  else {
	  descDisplay.appendChild(document.createTextNode(descString));
  }
  
  entryDiv.appendChild(descDisplay);
  
  /* add the map div (may get called upon later) */
  /* TODO: Get fancy with it, see showEntryMap below
  var mapDiv = document.createElement('div');
  mapDiv.setAttribute('id','wpng-entry-map');
  mapDiv.setAttribute('style','display:none;height:400px');
  entryDiv.appendChild(mapDiv);
  */
  
  /* add the div to my modified ThickBox function */
  tb_show_inner("",entryDiv.innerHTML,"height=500&width=500");
}

/**
 * Callback function for the Google data JS client library to call with a feed 
 * of events retrieved.
 *
 * Creates a list of events in a human-readable form. This list of
 * events is intended to be shown in a Wordpress sidebar widget
 *
 * @param {json} feedRoot is the root of the feed, containing all entries 
 */ 
function listWidgetEvents(feedRoot) {
  var entries = feedRoot.feed.getEntries();
  var eventDiv = document.getElementById('wpng-cal-widget-events');
  /* clear out anything in the current events DIV */
  while (eventDiv.firstChild) {
	  eventDiv.removeChild(eventDiv.firstChild);
  }

  /* loop through the events in the feed and output to the DIV */
  var prevDateString = null;
  var len = entries.length;
  var ulist = null;
  var sp = "";
  
  for (var i = 0; i < len; i++) {
	  var entry = entries[i];
	  var times = entry.getTimes();
	  
	  var startTime = times[0].getStartTime();
	  // get first day of month
	  var dDate = Date.parse(iDate);
	  /* note: using cool functions from DateJS for formatting */
	  var displayTime = startTime.getDate().clone();
	  //dDate = new Date(dDate.getFullYear(), iMonth ,1);
	  displayTime = Date.parse(dDate.toString('M')+','+displayTime.toString('d')+','+dDate.toString('yyyy'));
	  sp=sp+entry.getTitle().getText()+" - "+dDate.toString('M')+','+displayTime.toString('d')+','+dDate.toString('yyyy')+"<br />";
	  var dateString = null;
      if(iDay==0){
		  if (displayTime.clearTime().equals(Date.today())) {
			  dateString = 'oggi';
		  }
		  else if (displayTime.clearTime().equals(Date.today().add(1).days())) {
			  dateString = 'domani';
		  }
		  else {
				dateString = displayTime.toString('d - MMMM');
		  }
	  }else{
		dateString = iDay + " - " + displayTime.toString('MMMM');
	  }
	  /* if the date has changed then output a new title and start a new list */
	  if (dateString != prevDateString) {
		  /* append the list to the event DIV, unless this is the first one */
		  if (ulist != null) {
			  eventDiv.appendChild(ulist);
		  }
		  var titleDiv = document.createElement('div');
		  titleDiv.setAttribute('className','wpng-widget-date-title');
		  titleDiv.setAttribute('class','wpng-widget-date-title');
		  titleDiv.appendChild(document.createTextNode(dateString));
		  eventDiv.appendChild(titleDiv);
		  prevDateString = dateString;
		  /* the events are displayed in an undefined list, let's create it */
		  ulist = document.createElement('ul');
	  }
	  /* now display the event itself as an item in the list */
	  
	  /* create an anchor to the Facebox remote call for the title */
	  var title = entry.getTitle().getText();
	  itime = startTime.getDate().clone().toString('HH:mm');
	  if(itime == '00:00') itime = ' ';  //'Tutta la giornata';
	  var uri = entry.getSelfLink().getHref();
	  var anchorTitle = document.createElement('a');
	  //anchorTitle.setAttribute('className','thickbox');
	  anchorTitle.setAttribute('class','thickbox-calendar');
	  var iContent = entry.getContent().getText();
	  /*if(iContent.indexOf('<link>')>=0){
	    iContent = iContent.split('<link>');
		anchorTitle.setAttribute('href',setUrl(iContent[1]));
	  }else{
		anchorTitle.setAttribute('href','javascript:loadCalendarEntry("' + uri + '")');
	  }*/
	  if(setUrl(iContent)){
		anchorTitle.setAttribute('href',iContent);
	  }else{
		anchorTitle.setAttribute('href','javascript:loadCalendarEntry("' + uri + '")');
	  }

	  anchorTitle.appendChild(document.createTextNode(itime+' - '+title));
	  
	  /* add the event to the list */
	  var item = document.createElement('li');
	  item.appendChild(anchorTitle);
	  ulist.appendChild(item);
  }
  
  /* append the last list to the event DIV */
  if (ulist != null) {
	  eventDiv.appendChild(ulist);
  }
  
  /* if there were not any events, display a default message */
  if (len == 0) {
	  /* show a default message */
	  eventDiv.appendChild(document.createTextNode('Non ci sono altri eventi per questo mese.'));
  }
  
  var jentryError = jQuery(document.getElementById('wpng-cal-widget-js-errors'));
  jentryError.html(sp);

 
  /* Hide the loading image */
  $j("#wpng-cal-load-widget").fadeOut("fast");
  
  /* Animate the display of the list */
  $j("#wpng-cal-widget-events").slideDown("slow");
  
}

/**
 * Show a map using the description information using the Google Map API
 * TODO: Add a AJAX grabbed map to the Facebox using this function
 */
 
/*
function showEntryMap(address) { 
  entryMap = new google.maps.Map2(document.getElementById("wpng-entry-map"));
  geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        alert(address + " not found");
      } else {
        entryMap.setCenter(point, 13);
        var marker = new GMarker(point);
        entryMap.addOverlay(marker);
        marker.openInfoWindowHtml(address);
      }
    }
  );
  var test = jQuery('#wpng-entry-map').slideDown();
}
*/

/**
 * Callback function for the Google data JS client library to call when an error
 * occurs during the retrieval of the feed.  Details available depend partly
 * on the web browser, but this shows a few basic examples. In the case of
 * a privileged environment using ClientLogin authentication, there may also
 * be an e.type attribute in some cases.
 *
 * @param {Error} e is an instance of an Error 
 */
function handleGDError(e) {
  var entryError = document.getElementById('wpng-cal-widget-errors');
  if (e instanceof Error) {
    /* alert with the error line number, file and message */
    entryError.appendChild(document.createTextNode('Error at line ' + e.lineNumber + ' in ' + e.fileName + '\n' + 'Message: ' + e.message));
    /* if available, output HTTP error code and status text */
    if (e.cause) {
      var status = e.cause.status;
      var statusText = e.cause.statusText;
      entryError.appendChild(document.createTextNode('Root cause: HTTP error ' + status + ' with status text of: ' + statusText));
    }
  } else {
    entryError.appendChild(document.createTextNode(e.toString()));
  }
  entryError.setAttribute('style', 'display:none');
}

/* initialize the Google error handler */
google.setOnLoadCallback(init);
