////////////////////////
//File  : blog_ajax_json_search.js
//site  : http://java.cocolog-nifty.com/
//author: naoyuki
//year  : 2006
//この作品は、クリエイティブ・コモンズの帰属-同一条件許諾 2.1 日本ライセンスの下でライセンスされています。この使用許諾条件を見るには、http://creativecommons.org/licenses/by-sa/2.1/jp/をチェックするか、クリエイティブ･コモンズに郵便にてお問い合わせください。住所は：559 Nathan Abbott Way, Stanford, California 94305, USA です。
////////////////////////
/*
author:風柳(furyu)
date：2009/07/11
この作品は、上記ライセンスの継承条件に基づき、
http://java.cocolog-nifty.com/blog/files/javascript/blog_ajax_json_search.js
をベースに改変を行ったものです。
*/


var is_loaded = false;
var backnumber_url_list;
var entries;
var search_keyword;
var result_content;
var timerId;

load_center_id();
function load_center_id() {
    var center = document.getElementById( 'center' );
    if ( center ) {
        ligting_search_keyword( center );
    } else {
        window.setTimeout( 'load_center_id()', 5000 );
    }
}

function ligting_search_keyword( center ) {
    var args = getHashArgs();
    var searched_keyword = args.search_word;
    if ( searched_keyword ) {
        searched_keyword = searched_keyword.replace( /([\/\\\.\*\+\?\|\(\)\[\]\{\}\$\^])/g, "\\$1" );
        searched_keyword = searched_keyword.replace( /( +|　+)/, ' ' );
        searched_keyword = searched_keyword.replace( /( |　)$/, '' );
        var keywords = searched_keyword.split(/ |　/);
        var h3 = center.getElementsByTagName( 'h3' );
        h3[0].innerHTML = highlight( h3[0].innerHTML, keywords );
        var div = center.getElementsByTagName( 'div' );
        for ( var i = 0; i < div.length; i++ ) {
            if ( div[i].className == 'entry-body-text' || div[i].className == 'comment-content' ) { //  patched by furyu: add 'comment-content'
                div[i].innerHTML = highlight( div[i].innerHTML, keywords );
            }
        }
    }
}

// patched by furyu  ---  from  ---
var XHRAsyncGet=(function(){
    var getXHR=(function(){
        if (typeof ActiveXObject!="undefined") {
            var msXml=['Msxml2.XMLHTTP','Microsoft.XMLHTTP'],ci,len;
            for (ci=0,len=msXml.length; ci<len; ci++) with ({msXml:msXml[ci]}) {try {new ActiveXObject(msXml); return function(){return new ActiveXObject(msXml)}} catch(e) {}}
            return function(){return null};
        }
        else if (typeof XMLHttpRequest!="undefined") {return function(){return new XMLHttpRequest()}}
        else {return function(){return null}}
    })();
    return function(opt){
        var xh=getXHR(); if (!xh) return;
        try {xh.open('GET',opt.url,true)} catch(e) {if (typeof opt.onerror=='function') opt.onerror(xh);return}
        xh.onreadystatechange=function(){
            if (xh.readyState==4) {
                if ((200<=xh.status&&xh.status<300)||xh.status==0) {if (typeof opt.onload=='function') opt.onload(xh)}
                else {if (typeof opt.onerror=='function') opt.onerror(xh)}
                try {delete xh;} catch(e) {xh=null}
            }
        }
        xh.send('');
    };
})();   //  end of XHRexec()
// patched by furyu  ---  to  ---

function getHashArgs () {
    var args = new Object();
    var query = location.href.replace(/.*?#/,"");
   query = decodeURIComponent( query );
    var pairs = query.split("&");
    for ( var i = 0; i < pairs.length; i++ ) {
        var pos = pairs[i].indexOf('=');
        if ( pos == -1 ) continue;
        var argname = pairs[i].substring( 0, pos );
        var value = pairs[i].substring( pos + 1 );
        args[argname] = value;
    }
    return args;
}

function blogAjaxJsonSearch( archive_file_path, text ) {
    search_keyword = text;
    var div_tag = document.getElementsByTagName('div');
    for ( var i = 0; i < div_tag.length; i ++ ) {
        if ( div_tag[i].className == 'result' ) { // Pached by Dificlo
            result_content = div_tag[i];
            break; //   patched by furyu
        }
    }
    window.scrollTo(0,0);   //  patched by furyu
    result_content.innerHTML = 'now searching.';
    added_period( result_content );
    if ( is_loaded ) {
        search();
    } else {
        // patched by furyu  --- from --- ( referred to 'cocolog_ajax_search.js' )
        /* // original //
        //new Ajax.Request( archive_file_path, {method: 'get', onComplete: function(request){ parse_archive_data( request ); } } );    
        */
        XHRAsyncGet({url:archive_file_path, onload:function(xh){parse_archive_data(xh.responseText)}});
        // patched by furyu  ---  to  ---
    }
}

function added_period( content ) {
    if ( !is_loaded ) {
        result_content.innerHTML += '.';
        timerId = setTimeout("added_period()", 50 );
    }
}

function parse_archive_data( responseText ) {
        var data_string = responseText;
        data_string = data_string.replace( new RegExp( '<.*?>', "i"), '' );
        entries = eval( data_string );
        search();
}

function show_all_backnumbers() {
    var text = '<ol type=1 start=1 style="text-align:left;">';
    for ( var i = 0; i < entries.length-1; i++ ) {  //  patched by furyu: entries.length => entries.length-1
        text += '<li><a href="' + entries[i].link + '">' +entries[i].title + '</a></li>';
    }
    text += '</ol>';
    document.getElementById('center').innerHTML = text;
}

function search() {
    var result_data = new Array();
    search_keyword = search_keyword.replace( /([\/\\\.\*\+\?\|\(\)\[\]\{\}\$\^])/g, "\\$1" );
    search_keyword = search_keyword.replace( /( +|　+)/, ' ' );
    search_keyword = search_keyword.replace( /( |　)$/, '' );
    var keywords = search_keyword.split(/ |　/);
    var key = new Array();
    for (var i= 0;i<keywords.length;i++) {
        key[ key.length ] = new RegExp( keywords[i], "i" );
    }
    for ( var i= 0; i<entries.length-1; i++ ) { //  patched by furyu: entries.length => entries.length-1
        var is_match = false;
        for ( var j= 0; j<key.length; j++ ) {
            for (var k in entries[i]) {
                if (k != 'link' && entries[i][k] != '') {
                    var res_val = key[j].exec( entries[i][k] );
                    if (res_val) {
                        is_match = true;
                        break;
                    }
                }
            }
        }
/*
        var is_match = true;
        for ( var j= 0; j<key.length; j++ ) {
            var res_body = key[j].exec( entries[i].body );
            var res_title = key[j].exec( entries[i].title );
            if ( !res_body && !res_title ) {
                is_match = false;
            }
        }
*/
        if ( is_match ) {
            result_data[ result_data.length ] = entries[i];
        }
    }
    var result_html = '';
    if ( result_data.length == 0 ) {
        result_html = build_no_result_html( result_data, keywords ); // Pached by Digiclo
    } else {
        result_html = build_search_result_html( result_data, keywords );
    }
    is_loaded = true;
    clearTimeout(timerId);
    result_content.innerHTML = result_html;
}

function build_search_result_html( result_data, keywords ) {
    var html = '<div id="search_notice">※スペースでAND検索が出来ます。</div><div class="entry-top"></div><div class="entry"><h3 class="search_result">検索結果（' + result_data.length + '件ヒット ）</h3><div class="entry-body-top"></div><div class="entry-body"><div class="entry-body-text"><ol class="search_result">';
    for ( var i= 0; i<result_data.length; i++ ) {
      html += '<li><h2><a href="' + result_data[i].link + '#search_word=' + search_keyword + '">' + highlight( result_data[i].title, keywords ) + '</a></h2>';
      html += '<div class="result_body">' + highlight( trunc( result_data[i].body, keywords[0] ), keywords ) + '</div></li>';
    }
    html += '</ol></div></div><div class="entry-body-bottom"></div><p class="posted" style="text-align:right; font-size: smaller;"><span class="post-footers"></span><span class="separator"></span><span class="bo_so_copyright"></span></p></div><div class="entry-bottom"></div><div class="date-footer"></div>';
    return html;
}
// Add by Digiclo
function build_no_result_html( result_data, keywords ) {
    var html = '<div id="search_notice">※スペースでAND検索が出来ます。</div><div class="entry-top"></div><div class="entry"><h3 class="search_result">検索結果（0件ヒット ）</h3><div class="entry-body-top"></div><div class="entry-body"><div class="entry-body-text"><ol class="search_result"><p><em>一致するものはありませんでした。</em></p>';
    return html;
}

function trunc( text, keyword ) {
    var key = new RegExp( keyword, "i" );
    var res = key.exec( text );

    if (text) {
        if ( res ) {
            var index  = res.index;
            var length = res[0].length;
            var start;
            var end;

            start = (index-20)<0 ? 0: (index-20);
            end = 55;
            text = text.substring( start, index ) +
                   text.substr( index, length ) +
                   text.substr( index + length, end ) + '...';
        } else {
            text = text.substring( 0, 50 );
        }
    }
    return text;
}

function highlight( text, keywords ) {
    var keyword = '';
    for ( var i= 0; i<keywords.length; i++ ) {
        if ( i == keywords.length - 1 ) {
            keyword += keywords[i];
        } else {
            keyword += keywords[i] + '|'; 
        }
    }
// patched by furyu  --- from --- ( referred to 'cocolog_ajax_search.js' )
/* // original //
//  return text.replace( new RegExp( '(' + keyword + ')', "ig"), '<span style="background-color: #FFCC33;">' + "$1" + '</span>' );
*/
    var replaced_text = '';
    if (keyword && text) {
        replaced_text = text.replace( new RegExp( '(' + keyword + ')', "ig"), '<span class="search_hilight">' + "$1" + '</span>' );
        while( replaced_text.match( new RegExp( '(<[^>]+)<span class="search_hilight">(' + keyword + ')</span>(.*?>)', "ig") ) ) {
            replaced_text = replaced_text.replace( new RegExp( '(<[^>]+)<span class="search_hilight">(' + keyword + ')</span>(.*?>)', "ig"), "$1$2$3" );
        }
    } else {
        replaced_text = text;
    }
    return replaced_text;
// patched by furyu  ---  to  ---
}
