/** ************************************************************
    SYSTEM   : gela CMS
    TITLE    : トップページダイナミックHTMLの定義
    SCRIPT   : toppage.js
    VERSION  : Ver1.3.1
    LANGUAGE : JavaScript1.3
    CODESET  : UTF-8
    EXPLAIN  : トップページの動的操作を定義する。
    AUTHOR   : yap
    CREATED  : 2009/01/10  //as Ver1.2.1
    UPDATED  : 2010/12/04  //as Ver1.3.1
    CREDIT   : Copyright 2010 studio yap (http://yap.jp)
***************************************************************/

/***************************************************************
    初期設定
***************************************************************/

//ユーザーディレクトリの設定(DEMO用)
try {var userdir = userid + '/';} catch(e) {var userdir = '';}

//RSSフィードファイル名の定義
var fileNews = 'data/' + userdir + '_news/rssnews.xml';

//フィード表示エリアIDの定義
var areaNews = 'news';

//HTMLフォーマットの定義(%t:title,%l:link,%d:description,%p:dcDate|pubDate,%s:site-title)
var formHtml = '[%p] <a href=%l><strong>%t</strong></a><br />%d<hr />';

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

//新着マークの定義
var newMark = '<span style="color:red;font-size:smaller;">NEW</span>';

//新着マーク表示期間の定義(時間)(0の時:表示しない)
var newTerm = 3 * 24;

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

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

/***************************************************************
    RSSフィードの編集関数
***************************************************************/
function editRss(obj)
{
    //名前空間接頭辞の定義
    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));
        }

        //新着マークの付加
        if (newTerm) {
            var today = new Date();
            if (today - objDate < newTerm * 3600000) {valTitle += ' ' + newMark;}
        }

        //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 dispNews()
{
    //取得結果の表示
    if (document.getElementById(areaNews)) {
        if ((objNews.readyState == 4) && (objNews.status == 200)) {
            document.getElementById(areaNews).innerHTML = '<div class="expl">' + editRss(objNews) + '</div>';
        } else {
            document.getElementById(areaNews).innerHTML = '<div class="expl"><p>Loading...</p></div>';
        }
    }
}

/***************************************************************
    ニュースフィードの取得関数
***************************************************************/
function loadNews(fileName, areaName)
{
    //RSSフィードファイル名/フィード表示エリアIDの設定
    if (fileName !== undefined) {fileNews = fileName;}
    if (areaName !== undefined) {areaNews = areaName;}

    //ニュースフィードの表示
    objNews = createXMLHttpRequest(dispNews);
    if (objNews) {
        var param = '?time=' + (new Date().getTime());  //キャッシュの無効化
        objNews.open('GET', fileNews + param, true);
        objNews.send(null);
    }
}

/***************************************************************
    ページロード時の実行関数
    loadNews([RSSフィードファイル名[,フィード表示エリアID]])
***************************************************************/
window.onload = function()
{
    //ニュースフィードの取得
    loadNews();
}

