//グローバル変数の定義
var httpObj;               // HTTP通信用オブジェクト
var timerId;               // HTTP通信用タイマーオブジェクト
var timeout_sec = 10;      // HTTP通信タイムアウト秒数

var url_list = new Array();  // ボタンごとのRSSファイルURLの定義
//url_list['loadBtn1'] = 'http://www.8111.com/index.rdf';
url_list['loadBtn1'] = './rss/index.rdf.xml';
url_list['loadBtn2'] = './rss/index.rdf';

function dispXmlElement(xml) {
    // ルート要素を特定する
    var base_node;
    var i;
    for(i=0; i<xml.childNodes.length; i++) {
        if(xml.childNodes[i].tagName) {
            base_tagname = xml.childNodes[i].tagName;
            base_node = xml.childNodes[i];
            break;
        }
    }
    // ルート要素のタグ名からRSSフォーマットを特定する
    if(base_tagname == 'rdf:RDF') {

    } else if(base_tagname == 'rss' && base_node.getAttribute('version') == '2.0' ) {
        base_node = xml.getElementsByTagName('channel')[0];
    } else {
        alert('Unknown RSS Format : ' + item_tagname);
        return false;
    }
    // 記事要素のリストを抽出する
    var items = base_node.getElementsByTagName('item');
    // 記事要素の内容を解析する
    var displayframe = document.getElementById('displayframe');
    var itemframe = document.getElementById('itemframe');
    for (i=0; i<items.length; i++) {
        var item_title;
        var item_link;
        var item_desc = '';
        var item_date = '';
        var j=0;
        for(j=0; j<items[i].childNodes.length; j++) {
            var child = items[i].childNodes[j];
            var child_tag = items[i].childNodes[j].tagName;
            // 記事タイトル
            if(child_tag == 'title') {
                item_title = child.firstChild.nodeValue;
            // 記事URL
            } else if(child_tag == 'link') {
                item_link = child.firstChild.nodeValue;
            // 記事概要
            } else if(child_tag == 'description') {
                if(child.firstChild) {
                    item_desc = child.firstChild.nodeValue;
                }
            // 発行日時
            } else if(child_tag == 'dc:date') {      // RSS1.0
                if(child.firstChild) {
                    item_date = child.firstChild.nodeValue;
                }
            } else if(child_tag == 'pubDate') {      // RSS2.0
                if(child.firstChild) {
                    item_date = child.firstChild.nodeValue;
                }
            }
        }
        // テンプレートとなるタグ要素を複製
        var new_itemframe = itemframe.cloneNode(true);
        new_itemframe.removeAttribute('id');
        new_itemframe.id = 'item' + i;
        // 取り出した記事情報をタグに格納する
        var divs = new_itemframe.getElementsByTagName('div');
        divs[0].innerHTML = '<a href="' + item_link + '" target="_blank">' + item_title + '</a>';
        divs[1].innerHTML = item_desc;
        divs[2].innerHTML = item_date;
        // 生成したタグ要素をドキュメントに追加し表示する
        displayframe.appendChild(new_itemframe);
        new_itemframe.style.display = 'block';
    }
    // 読込ボタンを有効にする
    document.getElementById('loadBtn1').disabled = false;
    document.getElementById('loadBtn2').disabled = false;
}

function loadXml(e) {
    // 読込ボタンを無効にする
    document.getElementById('loadBtn1').disabled = true;
    document.getElementById('loadBtn2').disabled = true;
    // 押されたボタンを特定し、ボタンの参照を取得する
    var target_button = getTargetNode(e);
    // 現在表示されているRSS情報を削除する
    var displayframe = document.getElementById('displayframe');
    while(displayframe.lastChild) {
        displayframe.removeChild(displayframe.lastChild);
    }
    // XMLをHTTP通信で取得
    httpXmlRequest(url_list[target_button.id], 'GET', '', dispXmlElement, httpError);
    // バブリングとデフォルトイベントアクションの停止
    stopDefaultAndPropagation(e);
    return false;
}

function httpError(error) {
    alert(error);
}

// 引数に与えられたURLにHTTPリクエストを行ない、指定された関数を実行
function httpXmlRequest(target_url, method, data, success_func, error_func) {
    try {
        if(window.XMLHttpRequest) {
            httpObj = new XMLHttpRequest();
        } else if(window.ActiveXObject) {
            httpObj = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            httpObj = false;
        }
    } catch(e) {
        httpObj = false;
    }
    if(! httpObj) {
        httpObjGenerateFail();
    }
    timerId = setInterval('timeoutCheck()', 1000);
    httpObj.open(method, target_url, true);
    httpObj.onreadystatechange = function() {
        if (httpObj.readyState == 4) {
            clearInterval(timerId);
            if (httpObj.status == 200) {
                success_func(httpObj.responseXML);
            } else {
                error_func(httpObj.status + ' : ' + httpObj.statusText);
                return false;
            }
        }
    }
    httpObj.send(data);
}

// HTTPタイムアウト処理
function timeoutCheck() {
    timeout_sec --;
    if(timeout_sec <= 0) {
        // タイマーをストップする
        clearInterval(timerId);
        // HTTPリクエストを中断する
        httpObj.abort();
        // エラーダイアログを表示
        alert('タイムアウトです。');
        return false;
    }
}

// バブリングとデフォルトイベントアクションの停止
function stopDefaultAndPropagation(e) {
    // バブリング停止
    if(e.stopPropagation) {
        e.stopPropagation();
    }
    if(window.event) {
        window.event.cancelBubble = true;
    }
    // デフォルトイベントアクションを停止する
    if(e.preventDefault) {
        e.preventDefault();
    }
    if(window.event) {
        window.event.returnValue = false;
    }
}

function getTargetNode(e) {
    // 対象要素の参照を取得
    var target_node;
    if(e.target) {
      target_node = e.target;
    } else {
      target_node = e.srcElement;
    }
    // Safari対策
    if (target_node.nodeType == 3) {
        target_node = target_node.parentNode;
    }
    return target_node;
}

// load時の処理
function setListeners(e) {
    // ボタン要素にclickイベントリスナーをセット
    var loadBtn1 = document.getElementById('loadBtn1');
    var loadBtn2 = document.getElementById('loadBtn2');
    addListener(loadBtn1, 'click', loadXml, false);
    addListener(loadBtn2, 'click', loadXml, false);
}

// イベントリスナー登録
function addListener(elem, eventType, func, cap) {
    if(elem.addEventListener) {
        elem.addEventListener(eventType, func, cap);
    } else if(elem.attachEvent) {
        elem.attachEvent('on' + eventType, func);
    } else {
        alert('ご利用のブラウザーはサポートされていません。');
        return false;
    }
}

// load時のイベントリスナーをセットする
addListener(window, 'load', setListeners, false);