// jsan-search.js -- JSAN Search
// Copyright 2006 Yusuke Kawasaki http://www.kawa.net/

var LIBARIES_JSON = "index-libraries.json";
var AUTHORS_JSON  = "index-authors.json";
var JSAN_ROOT = "http://www.openjsan.org";
var QUERY_ID  = 'query';
var RESULT_ID = 'search_result';
var MODE_LIB  = 'mode_library';
var ERR_CLASS = 'notfound';
var QUERY_IGNORE = 'Enter.Here';
var TARGET_FRAME = 'main_frame';

var prev;
var loaded;
var data_cache = [];

function jsan_search () {
    var libmode = document.getElementById( MODE_LIB ).checked;
    var url = libmode ? LIBARIES_JSON : AUTHORS_JSON;
    if ( ! data_cache[url] ) {
        if ( Ajax ) {
            // avoid cache on opera
            if ( window.opera ) url += "?"+Math.floor(Math.random()*900+100);
            var json = Ajax.get( url );
            // safari utf-8 bug
            json = safari_utf8_fix( json );
            data_cache[url] = eval( "("+json+")" );
        } else {
            alert( "Ajax.js is not loaded." );
            return;
        }
    }

    var query = document.getElementById( QUERY_ID ).value.toUpperCase();
    if ( query == "" ) return;
    if ( url+query == prev ) return;
    prev = url+query;
    if ( query == QUERY_IGNORE.toUpperCase() ) return;

    var divtag = document.getElementById( RESULT_ID );
    var ultag = document.createElement("ul");

    var list = [];
    for( var name in data_cache[url] ) {
        var check = name;
        if ( libmode ) check += " "+data_cache[url][name].name;
        if ( ! check.toUpperCase().match( "(^|[^A-Za-z0-9])"+query ) ) continue;
        list[list.length] = name;
    }
    if ( list.length < 1 ) {
        document.body.className = ERR_CLASS;
        return;
    }
    document.body.className = "";

    list.sort();

    var len = list.length;

    for( var i=0; i<len; ++i ) {
        var key     = list[i];
        var hash    = data_cache[url][key];
        var litag   = document.createElement("li");
        var atag    = document.createElement("a");
        var name    = libmode ? key : hash.name;
        var tnode   = document.createTextNode( name );
        atag.target = TARGET_FRAME;
        atag.href   = JSAN_ROOT + hash.doc;
        atag.title  = libmode ? hash.distribution_name + " " + hash.distribution_version : key;
        atag.appendChild( tnode );
        litag.appendChild( atag );
        ultag.appendChild( litag );
    }
    
    var firsturl = JSAN_ROOT + data_cache[url][list[0]].doc;
    if ( firsturl != loaded ) {
        window.parent.main_frame.location.href = firsturl;
    }
    loaded = firsturl;

    if ( divtag.firstChild ) {
        divtag.replaceChild( ultag, divtag.firstChild );
    } else {
        divtag.appendChild( ultag );
    }
}

function safari_utf8_fix ( text ) {
    if ( navigator.appVersion.indexOf( "KHTML" ) > -1 ) {
        var esc = escape( text );
        if ( esc.indexOf("%u") < 0 && esc.indexOf("%") > -1 ) {
            text = decodeURIComponent( esc );
        }
    }
    return text;
}

