/*
 * multiGcalFullCalendar extension for fullCalendar
 * http://arshaw.com/fullcalendar/
 * 
 * Inlcudes convinience methods for getting a list of events in a range from 
 * multiple gcals.
 * 
 * 
 * Based on gcalFullCalendar by Adam Shaw
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

var gCalEvents =  gCalEvents || {};
//  Tags a list of calendar tuples. [ ["Cal1", 'cal1slug', "cal1feedurl"], ["Cal2", 'cal2slug' "cal2feedurl"] ]
gCalEvents.getEventsFromCalendars = function(calendars, start_date, end_date, callback) {

  this.events = [];
  this.start_date = start_date;
  this.end_date = end_date;  
  this.callback = callback;
  var that = this;

  function get_events(name, slug, uri) {
    var feedURL = uri.replace(/\/basic$/, '/full');
    var cal = {
      'url': feedURL,
      'name': name,
      'slug': slug
    };
    $.getJSON(feedURL + "?alt=json-in-script&callback=?",
      {
        'start-min': $.ISO8601String(that.start_date),
        'start-max': $.ISO8601String(that.end_date),
        'max-results': 200,
        'singleevents': true
      },
      function (data) {
        Queue.responses.push([cal, data]);
        Queue.checkDone();
      });
  };

  function process_events(cal, data) {
    if (data.feed.entry) {
      $.each(data.feed.entry, function(i, entry) {
        var url;
        $.each(entry['link'], function(j, link) {
          if (link.type == 'text/html') url = link.href;
        });
        that.events.push({
          id: entry['gCal$uid']['value'],
          url: url,
          title: entry['title']['$t'],
          start: $.parseISO8601(entry['gd$when'][0]['startTime'], true),
          end: $.parseISO8601(entry['gd$when'][0]['endTime'], true),
          location: entry['gd$where'][0]['valueString'],
          description: entry['content']['$t'],
          allDay: entry['gd$when'][0]['startTime'].indexOf('T') == -1,
          calendar_name: cal.name,
          calendar_slug: cal.slug,
          calendar_uri: cal.url,
          draggable: false
        });
      });          
    };
  };
  
  function sort_events(a, b) {
    return (a.start - b.start);
  }

  var Queue = {
    size: calendars.length,
    responses: [],
    checkDone: function() {
      if (this.responses.length == this.size) {
        for (i in this.responses) {
          process_events(this.responses[i][0], this.responses[i][1]);
        }
        that.events.sort(sort_events);
        return that.callback(that.events);
      }
    }
  };

  for (i in calendars) {
    var name = calendars[i][0];
    var slug = calendars[i][1];
    var uri = calendars[i][2];
    get_events(name, slug, uri);
  };
  return this
};

(function($) {

 $.fn.multiGcalFullCalendar = function(options) {
   
   $.extend(options, {
   
     events: function(start, end, callback) {
       new gCalEvents.getEventsFromCalendars(options.calendars, start, end, callback);
     },
     
     eventRender: function(event, element) {
       if (!event.allDay) element.addClass('nobg');
       element.addClass(event.calendar_slug);
     }
     
   });
   
   return this.fullCalendar(options);
 };

})(jQuery);

