function loadDataFile(tmpl_file, tmpl_file2, xml_file, disp_id, debug)
{
    // ステータス変更（処理開始フラグ）
    status_flag = 1;

    debug_mode = debug;
    inner_tmpl = tmpl_file2;
    fxml = xml_file

    disp = document.getElementById(disp_id);
    if (!disp) return false;

    if(tmpl_file2 == false){
        // non template2
        httpTmplObj = createXMLHttpRequest(getTemplate3);
        if (httpTmplObj)
        {
            httpTmplObj.open("GET", tmpl_file, true);
            // don't read cache
            httpTmplObj.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            httpTmplObj.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
            httpTmplObj.send(null);
        }
    }else{
        // exist template2
        httpTmplObj = createXMLHttpRequest(getTemplate1);
        if (httpTmplObj)
        {
            httpTmplObj.open("GET", tmpl_file, true);
            // don't read cache
            httpTmplObj.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            httpTmplObj.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
            httpTmplObj.send(null);
        }
    }

}

function getTemplate1()
{
    if (httpTmplObj.readyState == 4)
    {
        switch(httpTmplObj.status)
        {
        case 200:
            tmpl_txt = httpTmplObj.responseText;
            
            /**
             * safari文字化け対策
             * テンプレートにutf-8エンコード済文字列を記述した場合の対処方法
             */
            tmpl_txt = tmpl_txt.replace(/%0A/g,'');
            tmpl_txt = decodeURI(tmpl_txt);
            
            httpTmpl2Obj = createXMLHttpRequest(getTemplate2);
            if (httpTmpl2Obj)
            {
                httpTmpl2Obj.open("GET", inner_tmpl, true);
                // don't read cache
                httpTmpl2Obj.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                httpTmpl2Obj.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
                httpTmpl2Obj.send(null);
            }
            
            break;
        default:
            tmpl_txt = "";
            break;
        }
    }else{
        tmpl_txt = "";
    }
}

function getTemplate2()
{
    if (httpTmpl2Obj.readyState == 4)
    {
        switch(httpTmpl2Obj.status)
        {
        case 200:
            tmpl_txt2 = httpTmpl2Obj.responseText;
            
            /**
             * safari文字化け対策
             * テンプレートにutf-8エンコード済文字列を記述した場合の対処方法
             */
            tmpl_txt2 = tmpl_txt2.replace(/%0A/g,'');
            tmpl_txt2 = decodeURI(tmpl_txt2);
            
            // get data
            httpXmlObj = createXMLHttpRequest(displayData);
            if (httpXmlObj) {
                httpXmlObj.open("GET", fxml, true);
                // don't read cache
                httpXmlObj.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                httpXmlObj.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
                httpXmlObj.send(null);
            }
            break;
        default:
            tmpl_txt2 = "";
            break;
        }
        
    }else{
        tmpl_txt2 = "";
    }
}

function getTemplate3()
{
    if (httpTmplObj.readyState == 4)
    {
        switch(httpTmplObj.status)
        {
        case 200:
            tmpl_txt = httpTmplObj.responseText;
            tmpl_txt2 = "";
            
            /**
             * safari文字化け対策
             * テンプレートにutf-8エンコード済文字列を記述した場合の対処方法
             */
            tmpl_txt = tmpl_txt.replace(/%0A/g,'');
            tmpl_txt = decodeURI(tmpl_txt);

            // get data
            httpXmlObj = createXMLHttpRequest(displayData);
            if (httpXmlObj) {
                httpXmlObj.open("GET", fxml, true);
                // don't read cache
                httpXmlObj.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                httpXmlObj.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
                httpXmlObj.send(null);
            }
            
            break;
        default:
            tmpl_txt = "";
            break;
        }
        
    }else{
        tmpl_txt = "";
    }
}

function displayData()
{
    if (httpXmlObj.readyState == 4)
    {
        switch(httpXmlObj.status) {
        case 200:
            
            var xmlData = httpXmlObj.responseXML;

            if (xmlData.getElementsByTagName("feed").length)
            {
                var itemTags = xmlData.getElementsByTagName("entry");
            } else {
                var itemTags = xmlData.getElementsByTagName("item");
            }
            
            txt = "";
            txt2 = "";
            loop_body = new Array();
            loop_body_new = new Array();
            var n = 1;

            // 内部テンプレート：ループタグ内データ保存＆ループ簡易タグに置換＆ループタグ削除
            if (matched = tmpl_txt2.match(/<<loop>>(.*?)<<\/loop>>/g))
            {
                for (var j = 0; j < matched.length; j++)
                {
                    tmpl_txt2 = tmpl_txt2.replace(matched[j], '{{###loop'+j+'###}}');
                    loop_body_tmp = matched[j].replace('<<loop>>', '');
                    loop_body_tmp = loop_body_tmp.replace('<</loop>>', '');
                    loop_body[j] = loop_body_tmp;
                }
            }

            // 外部テンプレート：内部テンプレートタグ番号取得
            // （タグのないエントリー情報を取得しないため軽くなる）
            var entry_num_tmp1 = new RegExp('\\x7b\\x7b###entry([0-9]*)###\\x7d\\x7d', 'g');
            var entry_num_tmp2 = new RegExp('\\x7b\\x7b###entry([0-9]*)###\\x7d\\x7d');
            var entry_num = tmpl_txt.match(entry_num_tmp1);
            var entry_box_tmp = new Array;
            var entry_box = new Array;
            for(var o=0; o<entry_num.length; o++)
            {
                entry_box_tmp = entry_num[o].match(entry_num_tmp2);
                entry_box[o] = entry_box_tmp[1];
            }

            // 内部テンプレート：タグ置換
            var a = new Number(0);
            var b = new Number(0);
            for (var n in entry_box)
            {
                a = entry_box[n]-1;
                b = entry_box[n];
                var loop_place = "";
                if(!itemTags[a]) continue;
                txt2 = replaceTag(itemTags[a].childNodes, tmpl_txt2, '', 0, a);
                for(var k=0; k<loop_body.length; k++)
                {
                    loop_place = loop_body_new[0+"-"+a+"-"+k] ? loop_body_new[0+"-"+a+"-"+k] : "";
                    txt2 = txt2.replace('{{###loop'+k+'###}}', loop_place);
                }
                // 外部テンプレート：内部テンプレートタグ置換
                var sub_tmpl_tmp = new RegExp('\\x7b\\x7b###entry'+b+'###\\x7d\\x7d','g');
                var sub_tmpl = tmpl_txt.match(sub_tmpl_tmp);
                tmpl_txt = tmpl_txt.replace(sub_tmpl_tmp, txt2);
            }

            // 外部テンプレート：タグ置換
            var itemTags2 = xmlData.getElementsByTagName("feed");
            txt = replaceTag(itemTags2[0].childNodes, tmpl_txt, '', 1, 0);
            
            // ステータス変更（処理終了フラグ）
            status_flag = 2;
            
            break;
        default:
            txt = "";
        }
    } else {
        txt = "";
    }
    
    // 置換されなかったタグを削除
    var tag_tmp = new RegExp('\\x7b\\x7b.*?\\x7d\\x7d', 'g');
    txt = txt.replace(tag_tmp, '');
    
    if (debug_mode) txt = escapeHTML(txt);

    disp.innerHTML = txt;
}

/**
 * タグを置換する
 */
function replaceTag(nodes, tmpl, parentName, tmpl_type, entry_num, loop_flag)
{
    var l = tmpl_type;
    var m = entry_num;
    var pName = parentName ? parentName + '.' : '';
    for (var i = 0; i < nodes.length; i++) {
        if (nodes[i] && nodes[i].nodeType == 1)
        {
            // タグ名取得（ブラウザごとに違う＠ネームスペース：タグ名）
            // NN6.0＆他：nodes[i].tagName
            // NN7.0    ：nodes[i].prefix + ':' + nodes[i].nodeName
            // NN7.1    ：nodes[i].nodeName
            if(nodes[i].nodeName.length > nodes[i].tagName.length )
            {
                var tag_name = nodes[i].nodeName;
            } else {
                var tag_name = nodes[i].tagName;
            }
            if (nodes[i].prefix && tag_name.indexOf(nodes[i].prefix + ':') == -1)
            {
                tag = nodes[i].prefix + ':' + tag_name;
            } else {
                tag = tag_name;
            }
            
            // 外部テンプレートのタグ置換時にentryタグは無視する
            if(tag == "entry") continue;
            
            // タグ置換開始
            tagname = pName + tag;
            var nodevalue = '';
            if (nodes[i].childNodes.length > 1 || (nodes[i].childNodes.length == 1 && nodes[i].firstChild.nodeType == 1))
            {
                // 下のノードまで全て置換
                tmpl = replaceTag(nodes[i].childNodes, tmpl, tagname, l, m, true);
            }
            else
            {
                // ノード値取得
                switch (tagname)
                {
                case 'link':
                    if (nodes[i].getAttribute("href")){
                        nodevalue = nodes[i].getAttribute("href");
                    } else {
                        nodevalue = nodes[i].firstChild.nodeValue;
                    }
                    break;
                default:
                    if (nodes[i].firstChild) {
                        nodevalue = nodes[i].firstChild.nodeValue;
                    }
                    break;
                }
                
                // ループ部分のタグ置換
                if(loop_flag)
                {
                    var loop = "";
                    var tmp = "";
                    var re = new RegExp('\\x7b\\x7b'+tagname+'(\\x7cdate_format:.*)?\\x7d\\x7d');
                    for(var j=0; j<loop_body.length; j++)
                    {
                        if(loop_body_new[l+"-"+m+"-"+j])
                        {
                            loop = loop_body_new[l+"-"+m+"-"+j].match(re);
                            tmp = loop_body_new[l+"-"+m+"-"+j];
                        }
                        if(!loop)
                        {
                            loop = loop_body[j].match(re);
                            tmp = tmp+loop_body[j];
                        }
                        if(!loop) continue;
                        tmp = changeDateTag(tagname, tmp, nodevalue);
                        loop = tmp.match(re);
                        while(loop)
                        {
                            tmp = tmp.replace(re, nodevalue);
                            loop = tmp.match(re);
                        }
                        loop_body_new[l+"-"+m+"-"+j] = tmp;
                        tmp = "";
                    }
                }
                
                // その他のタグ置換
                tmpl = changeDateTag(tagname, tmpl, nodevalue);
                while (tmpl.indexOf('{{'+tagname+'}}') != -1)
                {
                    tmpl = tmpl.replace('{{'+tagname+'}}', nodevalue);
                }
            }
        }
    }
    return tmpl;
}

/**
 * 日付をフォーマットする
 */
function changeDateTag(tagname, tmpl, nodevalue)
{
    var date_format_tmp = new RegExp('\\x7b\\x7b'+tagname+'\\x7cdate_format:"(.*?)"\\x7d\\x7d');
    var date_format = tmpl.match(date_format_tmp);
    while(date_format)
    {
        tmpl = tmpl.replace(date_format_tmp, replaceDate(date_format[1], nodevalue));
        date_format = tmpl.match(date_format_tmp);
    }
    return tmpl;
}
function replaceDate(format, val)
{
    var ret = val;
    date = ret.split("T");
    ymd = date[0].split("-");
    time = date[1].split(":");
    format = format.replace('%Y', ymd[0]);
    format = format.replace('%m', ymd[1]);
    format = format.replace('%d', ymd[2]);
    format = format.replace('%H', time[0]);
    format = format.replace('%i', time[1]);
    format = format.replace('%s', time[2]);
    return format;
}

/**
 * HTMLソースをエスケープする
 */
function escapeHTML (txt)
{
    var amp = '%amp%';
    txt = replaceAll(txt, '&', amp);
    txt = replaceAll(txt, amp, '&amp;');
    txt = replaceAll(txt, '"', '&quot;');
    txt = replaceAll(txt, "'", '&#039');
    txt = replaceAll(txt, '<', '&lt;');
    txt = replaceAll(txt, '>', '&gt;');
    return txt;
}
function replaceAll (text, regexp, new_string)
{
    var tmp = text;
    var escape_tmp = new RegExp(regexp, 'g');
    text = tmp.replace(escape_tmp, new_string);
    return text;
}