jQuery.fn.extend({
  everyTime: function(interval, label, fn, times) {
    return this.each(function() {
      jQuery.timer.add(this, interval, label, fn, times);
    });
  },
  oneTime: function(interval, label, fn) {
    return this.each(function() {
      jQuery.timer.add(this, interval, label, fn, 1);
    });
  },
  stopTime: function(label, fn) {
    return this.each(function() {
      jQuery.timer.remove(this, label, fn);
    });
  }
});

jQuery.extend({
  timer: {
    global: [],
    guid: 1,
    dataKey: "jQuery.timer",
    regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
    powers: {
      // Yeah this is major overkill...
      'ms': 1,
      'cs': 10,
      'ds': 100,
      's': 1000,
      'das': 10000,
      'hs': 100000,
      'ks': 1000000
    },
    timeParse: function(value) {
      if (value == undefined || value == null)
        return null;
      var result = this.regex.exec(jQuery.trim(value.toString()));
      if (result[2]) {
        var num = parseFloat(result[1]);
        var mult = this.powers[result[2]] || 1;
        return num * mult;
      } else {
        return value;
      }
    },
    add: function(element, interval, label, fn, times) {
      var counter = 0;

      if (jQuery.isFunction(label)) {
        if (!times)
          times = fn;
        fn = label;
        label = interval;
      }

      interval = jQuery.timer.timeParse(interval);

      if (typeof interval != 'number' || isNaN(interval) || interval < 0)
        return;

      if (typeof times != 'number' || isNaN(times) || times < 0)
        times = 0;

      times = times || 0;

      var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});

      if (!timers[label])
        timers[label] = {};

      fn.timerID = fn.timerID || this.guid++;

      var handler = function() {
        if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
          jQuery.timer.remove(element, label, fn);
      };

      handler.timerID = fn.timerID;

      if (!timers[label][fn.timerID])
        timers[label][fn.timerID] = window.setInterval(handler,interval);

      this.global.push( element );

    },
    remove: function(element, label, fn) {
      var timers = jQuery.data(element, this.dataKey), ret;

      if ( timers ) {

        if (!label) {
          for ( label in timers )
            this.remove(element, label, fn);
        } else if ( timers[label] ) {
          if ( fn ) {
            if ( fn.timerID ) {
              window.clearInterval(timers[label][fn.timerID]);
              delete timers[label][fn.timerID];
            }
          } else {
            for ( var fn in timers[label] ) {
              window.clearInterval(timers[label][fn]);
              delete timers[label][fn];
            }
          }

          for ( ret in timers[label] ) break;
          if ( !ret ) {
            ret = null;
            delete timers[label];
          }
        }

        for ( ret in timers ) break;
        if ( !ret )
          jQuery.removeData(element, this.dataKey);
      }
    }
  }
});

jQuery(window).bind("unload", function() {
  jQuery.each(jQuery.timer.global, function(index, item) {
    jQuery.timer.remove(item);
  });
});

eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(3(4){4.f.g=3(7){b 2={c:h,8:\'j\'};9(7){4.k(2,7)}l 5.m(3(){b 0;$(5).n(2.c,3(i){9(i==1){6=$(5).d(\'a:e\')}o{6=0}0=$(6).p(\'a\');9(!$(0).q()){0=$(5).d(\'a:e\')}$(6).r(2.8);$(0).s(2.8)})})}})(4);',29,29,'prochain||settings|function|jQuery|this|current|options|speed|if|li|var|dureeAffichage|children|first|fn|easyticker|5000||slow|extend|return|each|everyTime|else|next|html|fadeOut|fadeIn'.split('|'),0,{}))

var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];


var handleNewsFeed = function(postsFeedRoot) {
  var posts = postsFeedRoot.feed.getEntries();

  // This variable will buffer HTML output until function completes
  var html = '<ul id=newsticker>';
  var li_attrs = 'style=\"display:block\"';

  for (var i = 0, post; post = posts[i]; i++) {
    //var postTitle = post.getTitle().getText();
    var postContent = post.getContent().getText();
    var postURL = post.getHtmlLink().getHref();
    var d = post.getPublished().getValue().getDate();
    var postDate = months[d.getMonth()] + ' ' + (d.getDate()-1) + ', ' + d.getFullYear();

    html += '<li ' + li_attrs + '><p>' + '<b class=d>' + postDate + '</b>' + postContent + '</p></li>';
    li_attrs = '';
  }
  html += '</ul>';
  var content = document.getElementById('newsfeed');
  content.innerHTML = html;
  $('#newsticker').easyticker();
}

var handleDonationsFeed = function(postsFeedRoot) {
  handleBlogPostFeed(postsFeedRoot, 'donationsfeed');
}

var handleBlogPostFeed = function(postsFeedRoot, outputId) {
  var posts = postsFeedRoot.feed.getEntries();

  // This variable will buffer HTML output until function completes
  var html = '';

  for (var i = 0, post; post = posts[i]; i++) {
    var postTitle = post.getTitle().getText();
    var postContent = post.getContent().getText();
    var postURL = post.getHtmlLink().getHref();
    var d = post.getPublished().getValue().getDate();
    var postDate = months[d.getMonth()] + ' ' + (d.getDate()-1) + '<br>' + d.getFullYear();

    html += '<div class=postWrapper><h3>' + postTitle + '</h3>'
         + '<table valign=top><tr valign=top>'
         + '<td><div class=postDate>' + postDate + '</div></td>'
         + '<td><div class=postContent>' + postContent + '</div></td>'
         + '</tr></table>';
  }
  var content = document.getElementById(outputId);
  content.innerHTML = html;
};

var handleError = function(error) {
  content.innerHTML = '<pre>' + error + '</pre>';
};

var getBlogFeed = function() {
  var feedUri = 'http://www.blogger.com/feeds/2627872152492708696/posts/default/-/testnews';
  var bloggerService =
    new google.gdata.blogger.BloggerService('biz.ganttproject');
  bloggerService.getBlogPostFeed(feedUri, handleNewsFeed, handleError);

  var donationsUri = 'http://www.blogger.com/feeds/2627872152492708696/posts/default/-/donations';
  bloggerService.getBlogPostFeed(donationsUri, handleDonationsFeed, handleError);
}

google.load("gdata", "1.x", {packages: ["blogger"]});
google.setOnLoadCallback(getBlogFeed);

