/* jFeed : jQuery feed parser plugin
 * Copyright (C) 2007 Jean-François Hovinne - http://www.hovinne.com/
 * Dual licensed under the MIT (MIT-license.txt)
 * and GPL (GPL-license.txt) licenses.
 */

jQuery.getFeed = function(options) {

    options = jQuery.extend({
    
        url: null,
        data: null,
        success: null
        
    }, options);

    if(options.url) {

        $.ajax({
            type: 'GET',
            url: options.url,
            data: options.data,
            dataType: 'xml',
            success: function(xml) {
                var feed = new JFeed(xml);
                if(jQuery.isFunction(options.success)) options.success(feed);
            },
            //エラー表示
            error: function(xml){
                $('#list-02').append('<p>読み込みに失敗しました。<\/p>');
            }
        });
    }
};

function JFeed(xml) {
    if(xml) this.parse(xml);
};

JFeed.prototype = {

    type: '',
    version: '',
    title: '',
    link: '',
    description: '',
    parse: function(xml) {
        
        if(jQuery('channel', xml).length == 1) {
        
            this.type = 'rss';
            var feedClass = new JRss(xml);

        } else if(jQuery('feed', xml).length == 1) {
        
            this.type = 'atom';
            var feedClass = new JAtom(xml);
        }
        
        if(feedClass) jQuery.extend(this, feedClass);
    }
};

function JFeedItem() {};

JFeedItem.prototype = {

    title: '',
    link: '',
    description: '',
    updated: '',
    id: ''
};

function JAtom(xml) {
    this._parse(xml);
};

JAtom.prototype = {
    
    _parse: function(xml) {
    
        var channel = jQuery('feed', xml).eq(0);

        this.version = '1.0';
        this.title = jQuery(channel).find('title:first').text();
        this.link = jQuery(channel).find('link:first').attr('href');
        this.description = jQuery(channel).find('subtitle:first').text();
        this.language = jQuery(channel).attr('xml:lang');
        this.updated = jQuery(channel).find('updated:first').text();
        
        this.items = new Array();
        
        var feed = this;
        
        jQuery('entry', xml).each( function() {
        
            var item = new JFeedItem();
            
            item.title = jQuery(this).find('title').eq(0).text();
            item.link = jQuery(this).find('link').eq(0).attr('href');
            item.description = jQuery(this).find('content').eq(0).text();
            item.updated = jQuery(this).find('updated').eq(0).text();
            item.id = jQuery(this).find('id').eq(0).text();
            
            feed.items.push(item);
        });
    }
};

function JRss(xml) {
    this._parse(xml);
};

JRss.prototype  = {
    
    _parse: function(xml) {
    
        if(jQuery('rss', xml).length == 0) this.version = '1.0';
        else this.version = jQuery('rss', xml).eq(0).attr('version');

        var channel = jQuery('channel', xml).eq(0);
    
        this.title = jQuery(channel).find('title:first').text();
        this.link = jQuery(channel).find('link:first').text();
        this.description = jQuery(channel).find('description:first').text();
        this.language = jQuery(channel).find('language:first').text();
        this.updated = jQuery(channel).find('lastBuildDate:first').text();
    
        this.items = new Array();
        
        var feed = this;
        
        jQuery('item', xml).each( function() {
        
            var item = new JFeedItem();
            
            item.title = jQuery(this).find('title').eq(0).text();
            item.link = jQuery(this).find('link').eq(0).text();
            item.description = jQuery(this).find('description').eq(0).text();
            item.updated = jQuery(this).find('pubDate').eq(0).text();
            item.id = jQuery(this).find('guid').eq(0).text();
            
            feed.items.push(item);
        });
    }
};


$(function(){
    //RSSが同じドメインにある場合
    $.ajax({
        url: 'http://labs.yusukenakanishi.com/feed/',
        //非同期通信
        async: true,
        //通信結果をキャッシュしない
        cache: false,
        dataType: "xml",
        success: function(xml){
            $(xml).find('item').each(function(i){
                if (i == 10) {
                    return false;
                }
                var title = $(this).find('title').text();
                var url = $(this).find('link').text();
                var date = $(this).find('pubDate').text(); 
                date = dateChanger(date);
                $('#list-01').append('<li>'+date+'<a href="'+url+'">'+title+'<\/a><\/li>');
            });
            $('#list-01 li').wrapAll('<ul><\/ul>');
        },
        //エラー表示
        error: function(xml){
            $('#list-01').append('<p>読み込みに失敗しました。<\/p>');
        }
    });
        
    //RSSが同じドメインにない場合
    $.getFeed({
        //url: 'proxy.php',
        url: 'http://labs.yusukenakanishi.com/feed/',
        success: function(feed){
            var html = '';
            for(var i = 0; i < 4 && i < 10; i++){
                var item = feed.items[i];
                html += '<li>' + '<span>' + dateChanger(item.updated) + '</span>' + '<a href="' + item.link + '">' + item.title + '<\/a><\/li>';
            }
            $('#list-02').append(html);
            $('#list-02 li').wrapAll('<ul><\/ul>');
        }
    });

    //月表示を数字表示に変換する
    var dateChanger = function(str){
        var mydate = new Date(str);
        yy = mydate.getFullYear();
        mm = mydate.getMonth() + 1;
        dd = mydate.getDate();
        if (mm < 10) { mm = "0" + mm; }
        if (dd < 10) { dd = "0" + dd; }
        datestr = yy + "." + mm + "." + dd;
        return datestr;
    };
    /*
    //月表示を数字表示に変換する（こんなやり方もある）
    var dateChanger = function(str){
        var changerM = {
            Jan: '1',
            Feb: '2',
            Mar: '3',
            Apr: '4',
            May: '5',
            Jun: '6',
            Jul: '7',
            Aug: '8',
            Sep: '9',
            Oct: '10',
            Nov: '11',
            Dec: '12'
        };
        //dateをスペースで区切り、2番目から5番目を抜き出し、逆順に変更
        str = str.split(" ").slice(1,4).reverse();
        //月の表示を英語表記から数字表記へ変換
        str[1] = str[1].replace(str[1],changerM[str[1]]);
        //年月日の追加
        str[0] = str[0] + "年";
        str[1] = str[1] + "月";
        str[2] = str[2] + "日";
        str = str.join("");
        return str;
    };
    */
});

