/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

var qs_min_search_string_length = 0;   //< shortest possible string to be queried
var qs_query_count = 0;                //< query sequence number to avoid overwriting with a previous answer
var qs_last_answer = 0;                //< query sequence number to avoid overwriting with a previous answer

var keycodes = new Array();
keycodes.left = 37;
keycodes.up = 38;
keycodes.right = 39;
keycodes.down = 40;
keycodes.enter = 13;
keycodes.esc = 27;
keycodes.del = 46;

var qs_last_term = new Array();
var qs_hl_term = new Array();
var types = new Array();

function qs_setClass( obj, cn, set)
{
    if (!obj) return;
    var cs = obj.className.split(' ');
    var ncs = new Array();
    for (var i=0; i<cs.length; i++)
    {
        if (cs[i] != cn) ncs[ncs.length]=cs[i];
    }
    if (set) ncs[ncs.length] = cn;
    obj.className = ncs.join(' ');
}

function searchUpdate(e)
{
    if (!e) e = window.event;
    var tag = (window.event) ? e.srcElement : e.target;
    var kind = tag.id.substr(7);
    var box = document.getElementById( kind+'_resultbox');

    var ch = 0;
    
    if (e.which == null)
        ch = e.keyCode;    // IE
    else if (e.which > 0)
        ch = e.which;	  // All others
    
    
    if (((tag.value && tag.value.length>=qs_min_search_string_length) || box.style.display!='none') && (qs_last_term[kind]!=tag.value))
    {
        qs_last_term[kind]=tag.value;
        qs_hl_term[kind]=null;
        showSearchResults(kind);
    }
}

function searchNavi(e)
{
    if (!e) e = window.event;
    var tag = (window.event) ? e.srcElement : e.target;
    var ch = 0;
    
    if (e.which == null)
        ch = e.keyCode;    // IE
    else if (e.which > 0)
        ch = e.which;	  // All others
    
    var kind = tag.id.substr(7);
    var box = document.getElementById( kind+'_resultbox');
    
    if (ch == keycodes.up || ch == keycodes.down)
    {
        if (box.style.display=='none')
        {
            qs_last_term[kind]=tag.value;
            qs_hl_term[kind]=null;
            showSearchResults(kind);
        }
        else
        {
            var ul = box.firstChild;
            if (ul && ul.tagName.toUpperCase()=='UL')
            {
                var list = ul.childNodes;
                if (qs_hl_term[kind]!=null)
                {
                    qs_setClass(list[qs_hl_term[kind]], 'highlight', false);
                }
                else
                {
                    qs_hl_term[kind]=-1;
                }
                if (ch==keycodes.up)
                {
                    qs_hl_term[kind]--;
                }
                else
                {
                    qs_hl_term[kind]++;
                }
                if (qs_hl_term[kind] < 0)
                {
                    qs_hl_term[kind]=list.length-1;
                }
                if (qs_hl_term[kind] >= list.length)
                {
                    qs_hl_term[kind]=0;
                }
                qs_setClass(list[qs_hl_term[kind]], 'highlight', true);
                t=list[qs_hl_term[kind]].offsetTop - list[0].offsetTop - box.offsetHeight/2;
                if (qs_hl_term[kind] < list.length-1)
                {
                    t += (list[qs_hl_term[kind]+1].offsetTop - list[qs_hl_term[kind]].offsetTop)/2;
                }
                
                //alert( "LI = " + list[qs_hl_term[kind]].offsetTop + ", UL= " + list[qs_hl_term[kind]].offsetParent.offsetTop + ", T = "+t);
                if (t > 0) 
                {
                    box.scrollTop = t;
                }
                else 
                {
                    box.scrollTop = 0;
                }
            }
        }
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
        return false;
    }
    if (ch == keycodes.esc)
    {
        qs_hl_term[kind]=-1;
        hideSearchResults(kind);
        for (var k in types)
        {
            var obj = document.getElementById('search_'+types[k]);
            if (obj)
            {
                obj.value = '';
            }
        }
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
        return false;
    }
    if (ch == keycodes.del)
    {
        tag.value = '';
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
        return false;
    }
    
    if (ch == keycodes.enter)
    {
        if (box.style.display=='none')
        {
            return false;
        }
        else
        {
            var ul = box.firstChild;
            if (ul && ul.tagName.toUpperCase()=='UL')
            {
                var list = ul.childNodes;
                if (qs_hl_term[kind]!=null) 
                {
                    var me = new Array();
                    if (window.event)
                        me.srcElement = list[qs_hl_term[kind]];
                    else
                        me.target = list[qs_hl_term[kind]];
                    selectItem(me);
                    
                    e.cancelBubble = true;
                    if (e.stopPropagation) e.stopPropagation();
                    return false;
                }
            }
        }
        return false;
    }
}

function toggleSearchResults(e)
{
    if (!e) e=window.event;
    var tag = (window.event) ? e.srcElement: e.target;
    var kind = tag.id.substr(5); // strlen('show_')
    var box = document.getElementById( kind+'_resultbox');
    if (box.style.display=='none')
    {
        showSearchResults(kind, 1);
    }
    else
    {
        hideSearchResults(kind);
    }
}

function hideSearchResults(kind)
{
    var box = document.getElementById(kind+'_resultbox');
    var toggle = document.getElementById('show_'+kind);
    if (box)
    {
        box.style.display = 'none';
    }
    if (toggle)
    {
        toggle.className = 'switch-off';
    }
}

function hideOtherSearchResults(kind)
{
    var sb=document.getElementById('booksearch');
    var n;
    if (!sb) return;

    for (i=0; i < sb.childNodes.length; i++)
    {
        if (sb.childNodes[i].tagName=='INPUT' && sb.childNodes[i].id.substr(0,6)=='search')
        {
             n = sb.childNodes[i].id.substr(7);
             if (n != kind)
             {
                 hideSearchResults(n);
             }
        }
    }
}

function selectItem(e)
{
    if (!e) e=window.event;
    var tag = (window.event) ? e.srcElement: e.target;
    var ln = tag.parentNode.name;
    var p = ln.indexOf('_');
    var kind = ln.substr(0, p);
    var sb = document.getElementById('search_'+kind);
    sb.value = tag.firstChild.nodeValue;
    num = parseInt(tag.childNodes[2].nodeValue);

    hideSearchResults(kind);
//    if (num <= 10)
    {
        loadContent();
    }
}

function loadContent()
{
    var params = new Array();
    var sb=document.getElementById('booksearch');
    if (!sb) return;

    for (i=0; i < sb.childNodes.length; i++)
    {
        if (sb.childNodes[i].tagName=='INPUT' && sb.childNodes[i].id.substr(0,6)=='search')
        {
            var n = sb.childNodes[i].id.substr(7);
            var v = sb.childNodes[i].value.trim();
            if (v)
            {
                params[params.length] = 'search_'+n+'='+Url.encode(v);
            }
        }
    }

    var ajax = new Ajax();
    var up = document.URL.toString().split('?');
    var p = up[0].lastIndexOf('/');
    var url = up[0].substr(0, p);
    qs_query_count++;
    url += '/index.php?page=qsearch&ajax=1&qn='+qs_query_count+'&'+params.join('&');
    ajax.sendRequest(url, function(req) { doManageQSResultResponse(ajax, req); } );
}

function showSearchResults(kind, full)
{
    var params = new Array();
    var sb=document.getElementById('booksearch');
    if (!sb) return;
    if (!full) full = 0;

    for (i=0; i < sb.childNodes.length; i++)
    {
        if (sb.childNodes[i].tagName=='INPUT' && sb.childNodes[i].id.substr(0,6)=='search')
        {
            var n = sb.childNodes[i].id.substr(7);
            var v = sb.childNodes[i].value.trim();
            if (v)
            {
                params[params.length] = n+'='+Url.encode(v);
            }
        }
    }

    var ajax = new Ajax();
    var up = document.URL.toString().split('?');
    var p = up[0].lastIndexOf('/');
    var url = up[0].substr(0, p);
    qs_query_count++;
    ajax.sendRequest(url+'/index.php?page=ajax&function=qs&box='+kind+'&qn='+qs_query_count+'&full='+full+'&'+params.join('&'), function(req) { doManageSearchResponse(ajax, req, kind); } );

    var box = document.getElementById(kind+'_resultbox');
    var toggle = document.getElementById('show_'+kind);
    if (box)
    {
        box.style.display = 'block';
    }
    if (toggle)
    {
        toggle.className = 'switch-on';
    }
    hideOtherSearchResults(kind);
}

/**
 *  Callback function to evaluate the Ajax answer.
 *  @params ajax is the calling AJAX Object
 *  @params req is the Request object
 *  @params kind is the kind of the search (author, title, publisher or category)
 *  
 */
function doManageSearchResponse( ajax, req, kind )
{
    if (req.readyState==4)
    {
            if (req.status == 200)
            {
                var ans = ajax.getResponse();
                var obj = document.getElementById(kind+'_resultbox');
                if (ans.content)
                {
                    var nc;
                    if (ans.content.length)
                    {
                        var qn = parseInt(ans.qn);
                        if (qn < qs_last_answer || qn > qs_query_count)
                        {
                            // older answer
                            return;
                        }
                        qs_last_answer = qn;
                        nc = document.createElement('UL');
                        nc.name = kind+"_list";
                        for (var i=0; i < ans.content.length; i++)
                        {
                            var li = document.createElement('LI');
                            var t = document.createTextNode(ans.content[i][0]);
                            
                            li.onclick = selectItem;
                            if (li.captureEvents)
                            {
                                li.captureEvents(Event.CLICK);
                            }
                            li.appendChild(t);
                            li.appendChild( document.createTextNode(" ("));
                            li.appendChild( document.createTextNode( ans.content[i][1] ));
                            li.appendChild( document.createTextNode(")"));
                            nc.appendChild(li);
                        }
                    }
                    else
                    {
                        nc = document.createElement('DIV');
                        var t = document.createTextNode(ans.message);
                        nc.appendChild(t);
                    }
                    if (obj.firstChild)
                    {
                        obj.replaceChild(nc, obj.firstChild);
                    }
                    else
                    {
                        obj.appendChild(nc);
                    }
                }
                //addlog('Ajax repsonse processed, news status = '+ans.status);
            }
            else
            {
                //addlog('Ajax error in response: '+req.status);
            }
    }
    else
    {
        //addlog('Ajax state = '+req.readyState);
    }
}

/**
 *  Callback function to evaluate the Ajax answer.
 *  @params ajax is the calling AJAX Object
 *  @params req is the Request object
 */
function doManageQSResultResponse( ajax, req )
{
    if (req.readyState==4)
    {
            if (req.status == 200)
            {
                var ans = ajax.getResponse();
                if (ans.content)
                {
                    var obj = document.createElement('div');
                    var cont = document.getElementById('content');
                    if (!cont) return;
                    var cp = cont.parentNode;
                    obj.setAttribute('id', 'searchResults');
                
                    var nc;
                    var qn = parseInt(ans.qn);
                    if (qn < qs_last_answer || qn > qs_query_count)
                    {
                        // older answer
                        return;
                    }
                    qs_last_answer = qn;
                    
                    obj.innerHTML = ans.content;
                    
                    var sr = document.getElementById('searchResults');
                    if (!sr)
                        cp.insertBefore( obj, cont);
                    else
                        cp.replaceChild( obj, sr );
                }
                
                //addlog('Ajax repsonse processed, news status = '+ans.status);
            }
            else
            {
                //addlog('Ajax error in response: '+req.status);
            }
    }
    else
    {
        //addlog('Ajax state = '+req.readyState);
    }
}

/**
 *  Register the keypress capture events on the input fields.
 *
 */
function onloadSearchLogic()
{
    var sb=document.getElementById('booksearch');
    if (!sb) return;

    for (i=0; i < sb.childNodes.length; i++)
    {
        if (sb.childNodes[i].tagName=='INPUT' && sb.childNodes[i].name.substr(0,6)=='search')
        {
            sb.childNodes[i].onkeydown = searchNavi;
            sb.childNodes[i].onkeyup = searchUpdate;
            sb.childNodes[i].setAttribute('autocomplete', 'off');
            if (sb.childNodes[i].captureEvents)
            {
                sb.childNodes[i].captureEvents(Event.KEYUP);
            }
            sb.childNodes[i].id = sb.childNodes[i].name;
            types[types.length] = sb.childNodes[i].name.substr(7);
        }
        else if (sb.childNodes[i].tagName=='INPUT' && sb.childNodes[i].name.substr(0,4)=='show')
        {
            sb.childNodes[i].onclick = toggleSearchResults;
            if (sb.childNodes[i].captureEvents)
            {
                sb.childNodes[i].captureEvents(Event.CLICK);
            }
            sb.childNodes[i].id = sb.childNodes[i].name;
        }
        else if (sb.childNodes[i].className=='results')
        {
            sb.childNodes[i].style.display='none';
        }
    }
}

// add the search logic to the startup functions
onloadTaskList[onloadTaskList.length] = onloadSearchLogic;

