/******************************************************************************
 *
 * Purpose: JS functions for XML based search definition
 * Author:  Armin Burger
 *
 ******************************************************************************
 *
 * Copyright (c) 2003-2006 Armin Burger
 *
 * This file is part of p.mapper.
 *
 * p.mapper is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version. See the COPYING file.
 *
 * p.mapper is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with p.mapper; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 ******************************************************************************/

function setSearchOptions() {
    var url = 'incphp/xajax/x_search.php?' + SID +'&action=optionlist';
    createSearchItems(url, '');
}

function setSearchInput() {
    var searchForm = _$('searchForm');
    var searchitem = searchForm.findlist.options[searchForm.findlist.selectedIndex].value;
    var url = 'incphp/xajax/x_search.php?' + SID +'&action=searchitem&searchitem=' + searchitem;
    //_$('searchForm').findlist.options[0].selected = true;  // reset parent select box to "Search for..."
    //alert(url);
    createSearchItems(url, '');
}


function json2Select(jsonObj, def) {
    var html = '<select name="' + jsonObj.selectname + '" ';
    var events = jsonObj.events;
    var size = jsonObj.size;
    
    if (size > 0) html += ' size="' + size +'" multiple="multiple" ';
    
    if (events) {
        /*for (var e in events) {
            html += e + '="' + events[e] + '" '; 
        }*/
        html += events;
    }

    html += '>';
    
    var options = jsonObj.options;
    if (def) html += '<option value=\"#\">*</option>';
    for (var o in options) {
        html += '<option value=\"' + o + '\">' + options[o] + '</option>';
    }
    html += '</select>';
    
    return html;
}


function createSearchInput(jsonObj) {
    var searchitem = jsonObj.searchitem;
    var fields     = jsonObj.fields;
    //alert(fields);
    var html = '';
    for (var i=0; i<fields.length; i++) {
        var description = fields[i].description;
        var fldname     = fields[i].fldname;
        var fldsize     = fields[i].fldsize;
        var fldsizedesc = fields[i].fldsizedesc;
        var fldinline   = fields[i].fldinline;
        var definition  = fields[i].definition;
        
        var inputsize = fldsize ? ' size="' + fldsize + '" ' : '';
        var sizedesc = fldsizedesc ? ' style="position:absolute; left:' + fldsizedesc + 'em"' : '';
        
        html += '<div class="searchitem">';
        if (!definition) {
            /*if (fldinline) html += '<div class="search_inline">';
			
            html += ' <div class="searchdesc">' + description + '</div>';
			html += ' <div' + sizedesc + '>' + '<input type="text" class="search_textinput" name="' + fldname + '"' + inputsize + '></div>';
            if (fldinline) html += '</div>';*/
            
        } else {
            //alert(description + ' - ' + fldname + ' - ' + definition);
            if (definition.type == 'options') {
                html += ' <div class="searchdesc">' + description + '</div>';
                html += ' <div>' + json2Select(definition, true) + '</div>';
            } else if (definition.type == 'suggest') {
                var searchitem  = definition.searchitem;
                var minlength   = definition.minlength;
                pmSuggest.minLength[fldname] = minlength;
                html += '  <div class="searchdesc">' + description + '</div>';
                html += '  <div>';
                html += '    <input type="text" id="' + fldname + '" name="' + fldname + '" alt="Search Criteria" ';
                html +=        ' onkeyup="initSearch(\'' + searchitem + '\', \'' +  fldname + '\')" onfocus="initSearch(\'' + searchitem + '\', \'' +  fldname + '\')" ';
                html +=        ' onblur="searchMouseOut(\'' + fldname + '\')" autocomplete="off" />';
                html += '   <div id="' + fldname + '_search_suggest" class="search_suggest" onmouseover="setMouseOverSuggest()" ';
                html +=         ' onmouseout="setMouseOutSuggest()">';
                html += '   </div>';
                html += ' </div>';
            
            } else if (definition.type == 'checkbox') {
                var value      = definition.value;
                var defchecked = ''; //(definition.checked == 1) ? ' checked ' : '' ; //" checked="checked" ' : '' ;                
                html += '<div class="searchdesc">' + description ;
                html += '<input type="checkbox" id="' + fldname + '" name="' + fldname + '" ' + '" value="' + value + '" ' + defchecked + ' /></div>';
            
            // Radio Button
            } else if (definition.type == 'radio') {
                var inputlist  = definition.inputlist;

                for (var ipt in inputlist) {
                    var defchecked = (definition.checked == 1) ? ' checked ' : '' ; //" checked="checked" ' : '' ;                
                    html += '<div>' + inputlist[ipt]; // + '</div>';
                    html += '<input type="radio" id="' + fldname + '" name="' + fldname + '" ' + '" value="' + ipt + '" ' + defchecked + ' /></div>';
                }
            
            } else if (definition.type == 'operator') {
                if (fldinline) html += '<div class="search_inline">';
                html += ' <div class="searchdesc">' + description + '</div>';
                html += ' <div' + sizedesc +'>' + json2Select(definition, false);
                html += ' <input type="text" class="search_textinput" name="' + fldname + '" ' + inputsize + '></div>';
                if (fldinline) html += '</div>';
            }
        }
        html += '</div>';
    }
    //para que no aparezcan los campos de la busqueda
    //html += '<div class="searchitem"><input type="button" value="' + localeList['Search'] + '" size="20" ';
    //html += 'onclick="submitSearch()" onmouseover="changeButtonClr(this, \'over\')" onmouseout="changeButtonClr (this, \'out\')"></div>';
    
    //html += '<div class="searchitem"><a href="javascript:submitSearch()" class="pm_button"> ' + localeList['Search'] + '</a></div>';

    html += '<input type="hidden"  name="searchitem" value="' + searchitem + '" />';
        
    //alert(html);
    return html;
    
}


function getFormKVP(formid) {
    var htmlform = document.getElementById(formid);
    //alert(searchForm.elements);
    var el = htmlform.elements;
    var s = '';
    for (var i=0; i < el.length; i++) {
        var e = el[i]; 
        var ename = e.name;
        var evalue = e.value;
        var etype = e.type;
        var delim = (i>0 ? '&' : '');
        
        if (evalue.length > 0 && evalue != '#') {
            //alert(etype + ' - ' + evalue);
            switch (etype) {
                //case 'text':
                case 'select-one':
                    s += delim + ename + '=' + e.options[e.selectedIndex].value;
                    break;
            
                case 'select-multiple':
                    var ol = e.options;
                    var opttxt = '';
                    for (var o=0; o < ol.length; o++) {
                        if (ol[o].selected) {
                            opttxt += ol[o].value + ',';
                        }
                    }
                    s += delim + ename + '=' + opttxt.substr(0, opttxt.length - 1); 
                    break;
                    
                case 'checkbox':
                    if (e.checked) {
                        s += delim + ename  + '=' + evalue;
                    }
                    break;
                    
                case 'radio':
                    if (e.checked) {
                        s += delim + ename  + '=' + evalue;
                    }
                    break;
                    
                default:
                    s += delim + ename  + '=' + evalue;
                    break;
            
            }
        }
    }
    //alert(s);
    return s;
}


/************************************************************************
 * SUGGEST functions
 * some snippets of this code were taken from http://www.DynamicAJAX.com
   => copyright 2006 Ryan Smith / 345 Technical / 345 Group.	
 ***********************************************************************/
// p.mapper Suggest object
var pmSuggest = new Object();
pmSuggest.minLength = new Object();
pmSuggest.slistobj = null;

// Cache for already executed queries
pmSuggest.suggestCache = new Object();

pmSuggest.mouseOverSuggest = false;


function setMouseOverSuggest() {
    pmSuggest.mouseOverSuggest = true;
}

function setMouseOutSuggest() {
    pmSuggest.mouseOverSuggest = false;
}


/**
 * Init suggest search with delay to avoid unnecessary DB queries while typing
 */
pmSuggest.suggest_timer = 0; 
function initSearch(searchitem, fldname) {
    clearTimeout(pmSuggest.suggest_timer);
    pmSuggest.suggest_timer = setTimeout("searchSuggest('" + searchitem + "', '" + fldname +"')", 200); 
}


/**
 * Run suggest search
 * use suggest cache if existing
 */
function searchSuggest(searchitem, fldname) {
    var searchStr = escape(_$(fldname).value);
    if (searchStr.length >= pmSuggest.minLength[fldname]) { 
        //alert(fldname);
        // Check first if query is in cache
        if (pmSuggest.suggestCache[searchStr]) {
            writeSuggestList(pmSuggest.suggestCache[searchStr], fldname); 
        // Otherwise make new query
        } else {
            var suggesturl = 'incphp/xajax/x_suggest.php?' + SID +'&search=' + searchStr + '&searchitem=' + searchitem + '&fldname=' + fldname;
            //alert(suggesturl);
            getSuggest(suggesturl, '');
        }
    } else {
        var sobj = _$(fldname + '_search_suggest');
        sobj.style.visibility = 'hidden';
    }
}


/**
 * Create the suggest list and fill the suggest div with child div's
 */
function writeSuggestList(suggestList, fldname) {
    var sobj = $('#' + fldname + '_search_suggest');
    var inputOffs = $('#' + fldname).offset();
    sobj.left(inputOffs['left'] - 10 + 'px');
    sobj.top(inputOffs['height'] + 'px');
    
    sobj.showv();
    sobj.html('');

    var suggest_all = '';
    for(i=0; i < suggestList.length ; i++) {
        var suggest = '<div onmouseover="javascript:suggestOver(this);" ';
        suggest += 'onmouseout="javascript:suggestOut(this);" ';
        suggest += 'onclick="setSearch(this.innerHTML, \'' + fldname + '\');" ';
        suggest += 'class="suggest_link">' + suggestList[i] + '</div>';
        suggest_all += suggest;
    }
    sobj.html(suggest_all);
}


/**
 * Mouse over function for suggest row
 */ 
function suggestOver(div_value) {
	div_value.className = 'suggest_link_over';
}


/**
 * Mouse out function for suggest row
 */
function suggestOut(div_value) {
	div_value.className = 'suggest_link';
}


/**
 * onClick function for suggest row
 */
function setSearch(value, fldname) {
    _$(fldname).value = value;
	_$(fldname + '_search_suggest').innerHTML = '';
    hideSuggest(fldname);
}



function searchMouseOut(fldname) {
    if (!pmSuggest.mouseOverSuggest) {
        setTimeout("hideSuggest('" + fldname + "')", 100);
    }
}

/**
 * Hide the suggest DIV when not needed (after insert or click ouside)
 */
function hideSuggest(fldname) {
    var sobj = _$(fldname + '_search_suggest');
    sobj.style.visibility = 'hidden';
}
