/**
 * File: jquery.parss.js
 * Author: Brad Westness
 * Date: 02/07/2011
 * Purpose: Append the contents of an RSS feed
 * to a set of list elements.
 */
(function(jQuery){ 
	jQuery.fn.PaRSS = function(feed_url, item_count, date_format, show_descriptions, description_length) {
    var ul_set = this,
    data = {
      feed_url: feed_url,
      item_count: item_count,
      date_format: date_format,
      show_descriptions: show_descriptions,
      description_length: description_length
    };
    
    /**
     * Initialize the Google Feed object and
     * load the actual feed
     */
    function initializeFeed() {
      var feed = new google.feeds.Feed(feed_url);
      feed.setNumEntries(item_count);
      feed.load(function(result) {
        if(!result.error){
          getItems(result.feed.entries);              
        }
      });
    }
    
    /**
     * Pull the content from the feed
     * items and add it to the ul
     */
    function getItems(entries){
      var list = "";
      jQuery.each(entries, function(i, entry) {
		if(entry.title.length>30){
        list_item = "<span class='parss-title'><a href='" + entry.link + "' rel='nofollow' target='_blank'>" + entry.title + "</a></span> <span class='parss-date'>" + getFormattedDate(entry.publishedDate, data.date_format) + "</span> <a href='" + entry.link + "' rel='nofollow' target='_blank'><img alt='Ver detalles del trabajo' src='http://gtrabajo.com/external_link_icon.gif' /></a>";

        switch (data.show_descriptions) {
          case "image":
            list_item += "<span class='parss-image'>" + getImageFromContent(entry.content) + "</span>" +
              "<span class='parss-description'>" + entry.contentSnippet + "</span>";
            break;
          case "content":
            list_item += "<span class='parss-description'>" + entry.content + "</span>";
            break;
          case true:
          case "true":
            list_item += "<span class='parss-description'>" + entry.contentSnippet + "</span>";
            break;
          default:
            break;
        }
        
        //
        // Add the item to the list
        //
        list += "<li>" + list_item + "</li>";         
      }});
      
      //
      // Add the list to the page
      //
      $(ul_set).append(list);     
    }
    /**
     * Format a date according to a supplied
     * format string using PHP date format
     * http://php.net/manual/en/function.date.php
     */
    function getFormattedDate(date, format) {
      var months = ["January","February","March","April","May","June","July","August","September","October","November","December"],
      days = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
      date = new Date(Date.parse(date)),
      formatted_date = format;
      
      formatted_date = formatted_date.replace("d", prependZeros(date.getDate()));
      formatted_date = formatted_date.replace("j", date.getDate());
      formatted_date = formatted_date.replace("N", date.getDay() + 1);      
      formatted_date = formatted_date.replace("w", date.getDay());      
      // unsupported: z (zero-based day of the year)
      // unsupported: W (one-based week of the year)
      formatted_date = formatted_date.replace("m", prependZeros(date.getMonth()));    
      formatted_date = formatted_date.replace("n", date.getMonth() + 1);     
      // unsupported: t (1-based number of days in the given month)   
      // unsupported: L (1 if leap year, 0 otherwise)
      formatted_date = formatted_date.replace("o", date.getFullYear());
      formatted_date = formatted_date.replace("Y", date.getFullYear());
      formatted_date = formatted_date.replace("y", date.getFullYear().toString().substring(2));    
      formatted_date = formatted_date.replace("a", (date.getHours() < 12) ? "am" : "pm");
      formatted_date = formatted_date.replace("A", (date.getHours() < 12) ? "AM" : "PM");
      // unsupported: B (Swatch Internet time, 000 through 999)
      formatted_date = formatted_date.replace("g", (date.getHours() > 12) ? date.getHours() - 12 : date.getHours());
      formatted_date = formatted_date.replace("G", date.getHours() > 12);
      formatted_date = formatted_date.replace("h", prependZeros((date.getHours() > 12) ? date.getHours() - 12 : date.getHours()));
      formatted_date = formatted_date.replace("H", prependZeros(date.getHours()));
      formatted_date = formatted_date.replace("i", prependZeros(date.getMinutes()));
      formatted_date = formatted_date.replace("s", prependZeros(date.getSeconds()));
      formatted_date = formatted_date.replace("u", date.getMilliseconds());
      // unsupported: e (timezone identifier)
      // unsupported: I (1 if daylight savings, else 0)
      formatted_date = formatted_date.replace("O", date.getTimezoneOffset());
      formatted_date = formatted_date.replace("P", date.getTimezoneOffset());
      // unsupported: T (timezone abbreviation)
      // unsupported: Z (timezone offset in seconds)
      formatted_date = formatted_date.replace("c", date.toUTCString());
      formatted_date = formatted_date.replace("r", date.toDateString());
      formatted_date = formatted_date.replace("U", date.valueOf());

      // date suffixes
      formatted_date = formatted_date.replace("S", getDateSuffix(date.getDate()));      
      
      // month names
      formatted_date = formatted_date.replace("F", months[date.getMonth()]);      
      formatted_date = formatted_date.replace("M", months[date.getMonth()].substring(0,3));  
      
      // day names
      formatted_date = formatted_date.replace("l", days[date.getDay()]);
      formatted_date = formatted_date.replace("D", days[date.getDay()].substring(0,3));

      return formatted_date;
    }
    
    /**
     * Determine the correct suffix
     * for a date of the month
     */
    function getDateSuffix(date) {
      switch (parseInt(date.toString().substring(-1))) {
        case 1:
          return "st";
          break;
        case 2:
          return "nd";
          break;
        case 3:
          return "rd";
          break;
        default:
          return "th";
          break;
      }
    }
     
    
    /**
     * Add a leading zero to single-digit numbers
     */
    function prependZeros(input) {
      var str = input.toString();
      if(str.length < 2) {
        str = "0" + str;
      }
      return str;
    }

    /**
     * Pull the first image from an feed item's content 
     * and return it as an HTML <img /> element
     */
    function getImageFromContent(content) {
      var img = content.match(/<img[^>+]*>/i);
      if(img) {
        var source = img[0].match(/src="[^"+]*"/i),
        alt = img[0].match(/alt="[^"+]*"/i);
        return "<img " + source + " " + alt + " />";
      }
      return "";
    }

    /**
     * Load the Google Feed API
     * and load the feed
     */
    jQuery.getScript("https://www.google.com/jsapi", function() {
      google.load("feeds", "1", {"callback": initializeFeed});      
    });    
  }
})(jQuery, this);
