/***************************************************************
    SYSTEM   : cms.ge.la
    TITLE    : トップページダイナミックHTMLの定義
    SCRIPT   : toppage.js
    VERSION  : Ver1.2.4
    LANGUAGE : JavaScript1.3
    CODESET  : UTF-8
    EXPLAIN  : トップページの動的操作を定義する。
    AUTHOR   : yap
    CREATED  : 2009/01/10  //as Ver1.2.1
    UPDATED  : 2009/05/15  //as Ver1.2.4
***************************************************************/

//RSSフィード名の定義
var fileFactory = 'data/_news/rssfact.xml';  //ファクトリ
var fileAtelier = 'data/_news/rssatel.xml';  //アトリエ

//フィードエリアの定義
var areaFactory = 'fact_news';
var areaAtelier = 'atel_news';

/***************************************************************
    RSSフィードの編集関数
***************************************************************/
function editRss(obj)
{
    //HTMLフォーマットの設定(%t:title,%l:link,%d:description,%p:dcDate|pubDate,%s:site-title)
    var formHtml = '<strong><a href=%l>%t</a></strong><br />[%p]<br />%d<hr />';

    //日付フォーマットの設定(%Y:年,%m:月,%d:日,%H:時,%i:分,%s:秒,%y:和歴年,%h:12時制時)
    var formDate = '%Y年%m月%d日';

    //最大表示件数の設定(0の時:無制限)
    var numMax = 0;

    //和歴との差分
    var eraYear = 1988;

    //名前空間接頭辞の定義
    var rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
    var dc  = 'http://purl.org/dc/elements/1.1/';

    //RSS要素の抽出(RSS2.0)
    var rss20 = true;
    var nodeRss = obj.responseXML.getElementsByTagName('rss');
    if (!nodeRss.length) {

        //RDF要素の抽出(RSS1.0)
        rss20 = false;
        if (obj.responseXML.getElementsByTagNameNS == undefined) {  //IEのみ
            nodeRss  = obj.responseXML.getElementsByTagName('rdf:RDF');
        } else {  //IE以外
            nodeRss  = obj.responseXML.getElementsByTagNameNS(rdf, 'RDF');
        }
    }

    //チャンネル要素の抽出
    var nodeChannel = nodeRss[0].getElementsByTagName('channel');

    //サイトタイトルの抽出
    var nodeSite = nodeChannel[0].getElementsByTagName('title');
    var valSite = nodeSite[0].firstChild.nodeValue;

    //アイテム要素の抽出
    var nodeItem = nodeRss[0].getElementsByTagName('item');

    //アイテム要素の数だけ繰り返し
    var strHtml = '';
    for (var i = 0; i < nodeItem.length; i++) {

        //表示件数のチェック
        if (numMax && i >= numMax) {break;}

        //アイテムタイトルの抽出
        var nodeTitle = nodeItem[i].getElementsByTagName('title');
        if (nodeTitle.length) {
            var valTitle = nodeTitle[0].firstChild.nodeValue;
        } else {var valTitle = '';}

        //アイテムリンクの抽出
        var nodeLink = nodeItem[i].getElementsByTagName('link');
        if (nodeLink.length) {
            var valLink = nodeLink[0].firstChild.nodeValue;
        } else {var valLink = '';}

        //アイテム説明の抽出
        var nodeDesc = nodeItem[i].getElementsByTagName('description');
        if (nodeDesc.length) {
            var valDesc = nodeDesc[0].firstChild.nodeValue;
        } else {var valDesc = '';}

        //アイテム日付の抽出(RSS2.0)
        var nodeDate = nodeItem[i].getElementsByTagName('pubDate');
        if (!nodeDate.length) {

            //アイテム日付の抽出(RSS1.0)
            if (nodeItem[i].getElementsByTagNameNS == undefined) {  //IEのみ
                nodeDate = nodeItem[i].getElementsByTagName('dc:date');
            } else {  //IE以外
                nodeDate = nodeItem[i].getElementsByTagNameNS(dc, 'date');
            }
        }
        if (nodeDate.length) {
            var valDate = nodeDate[0].firstChild.nodeValue;
        } else {var valDate = '';}

        //タイトルがなかった場合説明を採用
        if (!valTitle) {
            valTitle = valDesc;
            valDesc = '';
        }

        //アイテム日付の書式変換
        if (valDate) {
            if (!rss20) {
                valDate = valDate.replace(/(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+).*/, '$1/$2/$3 $4:$5:$6');
            }
            var objDate = new Date(valDate);
            var strDate = formDate;
            strDate = strDate.replace('%Y', objDate.getFullYear());
            strDate = strDate.replace('%y', ('0' + (objDate.getFullYear() - eraYear)).slice(-2));
            strDate = strDate.replace('%m', ('0' + (objDate.getMonth() + 1)).slice(-2));
            strDate = strDate.replace('%d', ('0' + objDate.getDate()).slice(-2));
            strDate = strDate.replace('%H', ('0' + objDate.getHours()).slice(-2));
            strDate = strDate.replace('%h', (objDate.getHours() > 12)? ('0' + (objDate.getHours() - 12)).slice(-2): ('0' + objDate.getHours()).slice(-2));
            strDate = strDate.replace('%i', ('0' + objDate.getMinutes()).slice(-2));
            strDate = strDate.replace('%s', ('0' + objDate.getSeconds()).slice(-2));
        }

        //HTML文の組み立て
        var tempHtml = formHtml;
        if (!valLink) {tempHtml = tempHtml.replace(/<a href="?%l"?.*?>(.+?)<\/a>/mi, '$1');}
        tempHtml = tempHtml.replace('%s', valSite);
        tempHtml = tempHtml.replace('%t', valTitle);
        tempHtml = tempHtml.replace('%l', valLink);
        tempHtml = tempHtml.replace('%d', valDesc);
        tempHtml = tempHtml.replace('%p', strDate);
        strHtml += tempHtml;
    }

    //戻り値のセット
    return strHtml;
}

/***************************************************************
    HTTP通信関数
***************************************************************/
function createXMLHttpRequest(cbFunc)
{
    var XMLhttpObject = null;
    try {
        XMLhttpObject = new XMLHttpRequest();
    } catch(e) {
        try {
            XMLhttpObject = new ActiveXObject('Msxml2.XMLHTTP');
        } catch(e) {
            try {
                XMLhttpObject = new ActiveXObject('Microsoft.XMLHTTP');
            } catch(e) {
                return null;
            }
        }
    }
    if (XMLhttpObject) {XMLhttpObject.onreadystatechange = cbFunc;}
    return XMLhttpObject;
}

/***************************************************************
    ファクトリフィードの表示関数
***************************************************************/
function dispFactory()
{
    //取得結果の表示
    if ((objFactory.readyState == 4) && (objFactory.status == 200)) {
        document.getElementById(areaFactory).innerHTML = editRss(objFactory);
    } else {
        document.getElementById(areaFactory).innerHTML = '<p>Loading...</p>';
    }
}

/***************************************************************
    アトリエフィードの表示関数
***************************************************************/
function dispAtelier()
{
    //取得結果の表示
    if ((objAtelier.readyState == 4) && (objAtelier.status == 200)) {
        document.getElementById(areaAtelier).innerHTML = editRss(objAtelier);
    } else {
        document.getElementById(areaAtelier).innerHTML = '<p>Loading...</p>';
    }
}

/***************************************************************
    RSSフィードの取得関数
***************************************************************/
function loadRss()
{
    //ファクトリフィードの表示
    objFactory = createXMLHttpRequest(dispFactory);
    if (objFactory) {
        var param = '?time=' + (new Date().getTime());  //キャッシュの無効化
        objFactory.open('GET', fileFactory + param, true);
        objFactory.send(null);
    }

    //アトリエフィードの表示
    objAtelier = createXMLHttpRequest(dispAtelier);
    if (objAtelier) {
        var param = '?time=' + (new Date().getTime());  //キャッシュの無効化
        objAtelier.open('GET', fileAtelier + param, true);
        objAtelier.send(null);
    }
}

/***************************************************************
    ページロード時の実行関数
***************************************************************/
window.onload = function()
{
    //RSSフィードの取得
    loadRss();
}
