
  // ++ program to manage HKB formular (mainly Author tab) ++

  var aaut = laut.split('!');
  var w_help = null; // to store reference of window with help 

  function open_help(h_url) {
    var prop = "";
    var wdw = window.innerWidth;
    var wdh = window.innerHeight;
    if (w_help == null || w_help.closed) {
      if ( isNaN(wdw) ) wdw = document.body.clientWidth;
      if ( isNaN(wdh) ) wdh = document.body.clientHeight;
      hwdh = wdh * 0.8;
      // if ( hwdh > 700) hwdh = 700;
      prop += "width=" + wdw * 0.8 + ",";
      prop += "height=" + hwdh + ",";
      prop += "location=no,menubar=no,status=no,toolbar=no,scrollbars=yes,resizable=yes";
      w_help = open(h_url, target="HkbHelp", prop)
      }
    else {
      w_help.location = h_url;
      w_help.focus()
      }
    }

  function radioClick(with_aut) {
    if(with_aut) 
      document.qaut.qainit.focus() ;
    else {
      var s_cla = get_radio_selected(document.qaut, "qacla") ;
      query_submit(s_cla, '') 
      }
  }


  function get_radio_selected(form, w_name) 
  {
    var sel = new Array() ;
    var c_nm = 0, ii = 0 ;
    for(ii=0; ii<form.elements.length; ii++) 
    {
      if(form.elements[ii].name == w_name) {
        c_nm++ ;
        if(form.elements[ii].checked) 
        { sel.push(form.elements[ii].value) ;
        }
      }
    }


    return sel;
  }

  function make_query(sela, index_name, cla_pfx, qaut) 
  { // -- sela is an Arry with selected button 
    var qarg = "", aarg = new Array();
    var elm = "",  xs=0; 
    var aelm = new Array();
    var op_prox = " !0 ", op_prox_skip_1 = " !1 ", op_prox_skip_2 = " !2 ";

    // -- v0.94: new method with proximity operator: !0 
    if (!sela || sela.length == 0) {
      qarg = "";
      }
    else {
      for(xs=0; xs<sela.length; xs++) {
        aarg = sela[xs].split(' ');
        elm = "";
        if (aarg.length == 1) {
          elm = cla_pfx + op_prox + aarg[0];
          if (qaut.length > 0) { 
            elm += op_prox_skip_1 + qaut;
            }
          }
        else { 
          if (aarg.length == 2) {
              elm = cla_pfx + op_prox + aarg[0] + op_prox + aarg[1];
              if (qaut.length > 0) {
                elm += op_prox + qaut;
                }
              }
            else {
              alert("E433: invalid selection code: '" + aarg.toString() + "' (ignored)");
              }
            }

        if (elm != "") {
          aelm.push( index_name + "=(" + elm + ")" );
          }
        }
      }

     // -- alert("aelm=" + aelm.join("; ") + "\n");

      if (aelm.length > 0) {
        qarg = aelm.join(" OR ");
        }
      else {
        qarg = index_name + "=(" + cla_pfx + op_prox_skip_2 + qaut + ")";
        }

    return qarg;
  }


  function get_aut_value() {
    var form = document.qaut;
    var x_aut = form.qasel.selectedIndex;
    var v_aut = ""; 
    if (x_aut > 0) {
      v_aut = form.qasel.options[x_aut].value
      }
    var aut_status = { init: form.qainit.value, sel:  x_aut, val:  v_aut };
    return aut_status ;
    }


  function init_aut_value(form) {
    form.qainit.value = y_status.aut;
    set_select(form, y_status.aut) 
    if (y_status.aut_sel >= 0) {
      form.qasel.selectedIndex = y_status.aut_sel;
      }
    }


  function reset_qaut(form) {
    cla_sel_all(form, 0);
    go_subdiv('');
    reset_qaut_aut(form);
    return null
    }


  function reset_qaut_aut(form) {
    y_status.aut = "";
    init_aut_value(form);
    return null
    }


  function query_cla(form) {
    var s_cla = get_radio_selected(form, "qacla") ;
    var query = "";

    query = make_query(s_cla, "WLB", "BEMU", ""); // No author attached ! 

    window.status = "Search in catalog: " + query
    url2 = url_catalog_server + encodeURI(query) ;
    open(url2, "HKBSearch") ;
  }


  function query_aut(form) {
    var s_cla = new Array(); // to avoid to use the classification !! 
    var s_aut = "" ;
    var qai_info = get_aut_value();

    if (qai_info.sel >= 0) {
      s_aut = qai_info.val ; 
      }
    else {
      alert("Please, select first an author?");
      document.qaut.qasel.focus();
      return; 
      }

    query = make_query(s_cla, "WLB", "BEMU", s_aut);

    window.status = "Search in catalog: " + query
    url2 = url_catalog_server + encodeURI(query) ;
    open(url2, "HKBSearch") ;
  }


  function query_both(form) {
    var s_cla = get_radio_selected(form, "qacla") ;
    var s_aut = "" ;
    var qai_info = get_aut_value();

    if (qai_info.sel >= 0) {
      s_aut = qai_info.val ; 
      }
    else {
      alert("Please, select first an author?");
      document.qaut.qasel.focus();
      return; 
      }

    query = make_query(s_cla, "WLB", "BEMU", s_aut);

    window.status = "Search in catalog: " + query
    url2 = url_catalog_server + encodeURI(query) ;
    open(url2, "HKBSearch") ;
  }


  function search_aaut_bound(init) {
    var bll = 0;
    var blh = 0;
    var bhl = 0;
    var bhh = aaut.length;
    var bvv = 0;
    var kok = false;
    var vaut = '';
    var vkey = '';
    var bound = new Object();

    while (kok == false && (bhh-bll) > 1) {
      bvv = Math.floor((bll + bhh)/2)
      vaut = aaut[bvv].split(':');
      vkey = vaut[0].substr(0,init.length) ;
      if (vkey < init) 
        bll = bvv
      else if (vkey > init) 
        bhh = bvv
      else
        kok = true
      }
    if (kok) {
      blh = bvv;
      bhl = bvv;
      l_kok = false;
      h_kok = false;
      while (l_kok == false || h_kok == false) {
        if((blh-bll) > 1) {
          blv = Math.floor((bll + blh)/2)
          vaut = aaut[blv].split(':');
          vkey = vaut[0].substr(0,init.length);
          if (vkey < init) 
            bll = blv
          else if (vkey >= init) 
            blh = blv
          }
	else
	  l_kok = true

        if((bhh-bhl) > 1) {
          bhv = Math.floor((bhl + bhh)/2)
          vaut = aaut[bhv].split(':');
          vkey = vaut[0].substr(0,init.length);
          if (vkey <= init) 
            bhl = bhv
          else if (vkey > init) 
            bhh = bhv
          }
	else
	  h_kok = true
      }
    }
    bound.low = bll
    bound.high = bhh
    return bound
  }


  var last_qainit = ""

  function set_select(form, new_val) 
  {
    var q_ini = NormalizeString( new_val.toLowerCase() ) ;
    var last_qainit = "", vaut = "", bound = 0; 
    if (q_ini.length < 2) {
      reset_select(form);
      form.qasel.options[form.qasel.options.length] = new Option('-- ?? --', '');
    }
    else if ( last_qainit != q_ini ) {
      last_qainit = q_ini ;
      reset_select(form);
      form.qasel.options[form.qasel.options.length] = new Option('-- select an author --', '');
      bound = search_aaut_bound(q_ini)
      for(var ii=bound.low; ii <= bound.high; ii++) {
        vaut = aaut[ii].split(':');
	form.qasel.options[form.qasel.options.length] = new Option(vaut[1], vaut[2]);
        }
      }
  }

  function reset_select(form) {
      for(var ii=form.qasel.options.length-1; ii>=0; ii--)
        form.qasel.remove(ii)
    }

  function store_Keys(main_form, ev) {
    var key_id = "", key_src = "", key = "";
    var new_value = "";
    if (ev.keyCode) {
      key_id = ev.keyCode;
      key_src = "keyCode";
      } 
    else { 
      key_id = ev.which; 
      key_src = "which";
      }
    key = String.fromCharCode(key_id)
    old_value = main_form.qainit.value
    if(key_id == ev.DOM_VK_BACK_SPACE) 
      new_value = old_value.substr(0,old_value.length-1) ;
    else if (key_id >= 32)
      new_value = old_value + key ;
    else
      new_value = old_value
    set_select (main_form, new_value) 
    return key_id;
  }


  function NormalizeString(stri) 
  { 
    var re_period = new RegExp('[.]', 'g');

    var re_char_a  = new RegExp('[\xE0\xE1\xE2\xE3\xE5\xC0\xC1\xC2\xC3\xC5]', 'g');
    var re_char_ae = new RegExp('[\xE4\xC4\xE6\xC6]',                 'g');
    var re_char_c  = new RegExp('[\xE7\xC7]',       'g');
    var re_char_d  = new RegExp('[\xF0\xD0]',       'g');
    var re_char_e  = new RegExp('[\xE8\xE9\xEA\xEB\xC8\xC9\xCA\xCB]', 'g');
    var re_char_i  = new RegExp('[\xEC\xED\xEE\xEF\xCC\xCD\xCE\xCF]', 'g');
    var re_char_n  = new RegExp('[\xF1\xD1]',       'g');
    var re_char_o  = new RegExp('[\xF2\xF3\xF4\xF5\xF8\xD2\xD3\xD4\xD5\xD8]', 'g');
    var re_char_oe = new RegExp('[\xF6\xD6]',                         'g');
    var re_char_u  = new RegExp('[\xF9\xFA\xFB\xD9\xDA\xDB]',         'g');
    var re_char_ue = new RegExp('[\xFC\xDC]',       'g');
    var re_char_y  = new RegExp('[\xFD\xFF\xDD]',   'g');
    var re_char_pct = new RegExp("['.:;_?!*+-]",    'g');
    var re_char_vrg = new RegExp(' *, *',           'g');
    var re_char_bob = new RegExp(' */ *',           'g');
    var re_char_parg = new RegExp(' *\\( *',        'g');
    var re_char_pard = new RegExp(' *\\) *',        'g');
    var re_char_dbk = new RegExp('   *',            'g');
    var re_lstrip   = new RegExp('^ *');
    var re_rstrip   = new RegExp(' *$');

    stri = stri.replace(re_period, ',');
    stri = stri.replace(re_char_a, 'a').replace(re_char_ae, 'ae').replace(re_char_e, 'e').replace(re_char_i, 'i');
    stri = stri.replace(re_char_o, 'o').replace(re_char_oe, 'oe').replace(re_char_u, 'u').replace(re_char_ue, 'ue');
    stri = stri.replace(re_char_n, 'n').replace(re_char_c,  'c').replace(re_char_d,  'd').replace(re_char_y,  'y');
    stri = stri.replace(re_char_pct, ' ').replace(re_char_vrg, ', ').replace(re_char_bob, ' / ');
    stri = stri.replace(re_char_parg, ' (').replace(re_char_pard, ') ');
    stri = stri.replace(re_char_dbk, ' ').replace(re_lstrip, '').replace(re_rstrip, '');

    return stri;
  }
  
