﻿/**
 * Plugin: jquery.zRSSFeed
 * 
 * Version: 1.1.2
 * (c) Copyright 2010-2011, Zazar Ltd
 * 
 * Description: jQuery plugin for display of RSS feeds via Google Feed API
 *              (Based on original plugin jGFeed by jQuery HowTo. Filesize function by Cary Dunn.)
 * 
 * History:
 * 1.1.2 - Added user callback function due to issue with ajaxStop after jQuery 1.4.2
 * 1.1.1 - Correction to null xml entries and support for media with jQuery < 1.5
 * 1.1.0 - Added support for media in enclosure tags
 * 1.0.3 - Added feed link target
 * 1.0.2 - Fixed issue with GET parameters (Seb Dangerfield) and SSL option
 * 1.0.1 - Corrected issue with multiple instances
 *
 **/

(function($){

  $.fn.rssfeed = function(url, options, fn) { 
  
    // Set pluign defaults
    var defaults = {
      limit: 10,
      header: true,
      titletag: 'h4',
      date: true,
      content: false,
      snippet: true,
      showerror: true,
      errormsg: '',
      key: null,
      ssl: false,
      linktarget: '_blank'
    };  
    var options = $.extend(defaults, options); 

    // Google Ajax Feed API キャッシュ騙し
    var mhd = new Date();

    // 月を取得
    var dqMonth = mhd.getMonth();

    // 日を取得
    var dqDate = mhd.getDate();

    // 時間を取得
    var dqTime = mhd.getHours();

    // 月日時間を結合
    var dummy_query = dqMonth + "0" + dqDate + "0" + dqTime;

    url = url + "?" + dummy_query;

    // Functions
    return this.each(function(i, e) {
      var $e = $(e);
      var s = '';

      // Check for SSL protocol
      if (options.ssl) s = 's';
      
      // Add feed class to user div
      if (!$e.hasClass('rssFeed')) $e.addClass('rssFeed');
      
      // Check for valid url
      if(url == null) return false;
      
      // Create Google Feed API address
      var api = "http"+ s +"://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + encodeURIComponent(url);
      if (options.limit != null) api += "&num=" + options.limit;
      if (options.key != null) api += "&key=" + options.key;
      api += "&output=json_xml"

      // Send request
      $.getJSON(api, function(data){
        
        // Check for error
        if (data.responseStatus == 200) {
  
          // Process the feeds
          _process(e, data.responseData, options);

          // Optional user callback function
          if ($.isFunction(fn)) fn.call(this,$e);
          
        } else {

          // Handle error if required
          if (options.showerror)
            if (options.errormsg != '') {
              var msg = options.errormsg;
            } else {
              var msg = data.responseDetails;
            };
            $(e).html('<div class="rssError"><p>'+ msg +'</p></div>');
        };
      });       
    });
  };
  
  // Function to create HTML result
  var _process = function(e, data, options) {

    // Get JSON feed data
    var feeds = data.feed;
    if (!feeds) {
      return false;
    }
    var html = '';  
    var row = 'odd';
    
    // Get XML data for media (parseXML not used as requires 1.5+)
    var xml = getXMLDocument(data.xmlString);
    var xmlEntries = xml.getElementsByTagName('item');
    
    // Add header if required
    /* header情報を非表示

    if (options.header)
      html += '<div class="rssHeader">' +
        '<a href="'+feeds.link+'" title="'+ feeds.description +'">'+ feeds.title +'</a>' +
        '</div>';

    */

    // Add body
    html += '<div class="rssBody">' +
      '<ul>';
    
    // Add feeds
    for (var i=0; i<feeds.entries.length; i++) {
      
      // Get individual feed
      var entry = feeds.entries[i];
    
      // Format published date
      var entryDate = new Date(entry.publishedDate);

      // 時間表示を非表示
      //var pubDate = entryDate.toLocaleDateString() + ' ' + entryDate.toLocaleTimeString();
      //var pubDate = entryDate.toLocaleDateString();
      var pubDate = createDateString(entryDate);

      //「PR:」から始まるものがあればSKIP
      if(entry.title.match(/^PR:/)) {
      }
      else{

        // Add feed row
        html += '<li class="rssRow '+row+'">' + '<div>' + pubDate + '</div>' +
          '<'+ options.titletag +'><a href="'+ entry.link +'" title="View this feed at '+ feeds.title +'" target="'+ options.linktarget +'">'+ entry.title +'</a></'+ options.titletag +'>'

        //日付表示位置変更
        //if (options.date) html += '<div>'+ pubDate +'</div>'

        if (options.content) {

          // Use feed snippet if available and optioned
          if (options.snippet && entry.contentSnippet != '') {
            var content = entry.contentSnippet;
          } else {
            var content = entry.content;
          }
          
          html += '<p>'+ content +'</p>'
        }
        else {
          //optionでcontentをfalseにしてコメントを非表示
          //html += '<p>'+ content +'</p>'
        }

        // Add any media
        if(xmlEntries.length > 0) {
          var xmlMedia = xmlEntries[i].getElementsByTagName('enclosure');
          if (xmlMedia.length > 0) {
            html += '<div class="rssMedia"><div>Media files</div><ul>'
            for (var m=0; m<xmlMedia.length; m++) {
              var xmlUrl = xmlMedia[m].getAttribute("url");
              var xmlType = xmlMedia[m].getAttribute("type");
              var xmlSize = xmlMedia[m].getAttribute("length");
              html += '<li><a href="'+ xmlUrl +'" title="Download this media">'+ xmlUrl.split('/').pop() +'</a> ('+ xmlType +', '+ formatFilesize(xmlSize) +')</li>';
            }
            html += '</ul></div>'
          }
          html += '</li>';
        }
      
        // Alternate row classes
        if (row == 'odd') {
          row = 'even';
        } else {
          row = 'odd';
        }

      }

    }
    
    html += '</ul>' +
      '</div>'
    
    $(e).html(html);
  };
  
  function formatFilesize(bytes) {
    var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
    var e = Math.floor(Math.log(bytes)/Math.log(1024));
    return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
  }

  function getXMLDocument(string) {
    var browser = navigator.appName;
    var xml;
    if (browser == 'Microsoft Internet Explorer') {
      xml = new ActiveXObject('Microsoft.XMLDOM');
      xml.async = 'false'
      xml.loadXML(string);
    } else {
      xml = (new DOMParser()).parseFromString(string, 'text/xml');
    }
    return xml;
  }

  function createDateString(publishedDate){
    var pdate = new Date(publishedDate);

    /* ブログ更新日付を通算秒で取得 */
    var update_msec = pdate.getTime();

    /* 本日日付の通算秒を取得 */
    var today_msec  = (new Date()).getTime();

    var pyear   = pdate.getFullYear();
    var pmonth  = pdate.getMonth() + 1;
    var pday    = pdate.getDate();
    var phour   = pdate.getHours();
    var pminute = pdate.getMinutes();
    var psecond = pdate.getSeconds();

    /* YYYY/MM/DD形式に変換する */
    var mm      = toDoubleDigits(pmonth);
    var dd      = toDoubleDigits(pday);
    var hh      = toDoubleDigits(phour);
    var mi      = toDoubleDigits(pminute);
    var ss      = toDoubleDigits(psecond);

    /* 本日日付から2日以内の場合、NEW!を付加する */
    if ( ( today_msec - ( 48 * 60 * 60 * 1000 ) ) <= update_msec ) {
        var strdate = pyear + "/" + mm + "/" + dd + " New!";
    }
    else {
        var strdate = pyear + "/" + mm + "/" + dd;
    }

    return strdate;
  }

  function toDoubleDigits(num) {
    num += "";
    if (num.length === 1) {
      num = "0" + num;
    }
    return num;
  }

})(jQuery);

